Ответы пользователя по тегу PHP
  • Можно ли в конструктор закладывать логику?

    @a_ovchinnikov
    Web developer
    Как правило конструктор выполняет подготовку объекта к его дальнейшему существованию. В вашем случае наличие такого вызова вполне уместно, т.к по сути это тоже элемент инициализации объекта.
    Ответ написан
    Комментировать
  • Как заменить значение в многомерном массиве?

    @a_ovchinnikov
    Web developer
    Если я вас правильно понял, то что-то вроде этого:

    <?php
    
    $arr = [
        [
            'result' => 'a',
            'components' => [
                2,
                41
            ],
            'formula' => '2 + 41',
            'answer' => 43
        ],
        [
            'result' => 'd',
            'components' => [
                'a',
                1
            ],
            'formula' => 'a - 1',
            'answer' => ''
        ]
    ];
    
    $resultArr = doReplacement($arr);
    var_dump($resultArr);
    
    function doReplacement(array $arr)
    {
        foreach ($arr as &$item)
        {
            $components = &$item['components'];
            $formula = &$item['formula'];
            foreach ($components as &$component)
            {
                if (!is_numeric($component))
                {
                    $value = findComponentValue($arr, $component);
                    $formula = str_replace($component, $value, $formula);
    
                    $component = $value;
                }
            }
    
            if (empty($item['answer']))
            {
                // calculate formula
            }
        }
    
        return $arr;
    }
    
    function findComponentValue(array $arr, $component)
    {
        $value = 0;
        foreach ($arr as $item)
        {
            $result = $item['result'];
            if ($result == $component)
            {
                $value = intval($item['answer']);
            }
        }
    
        return $value;
    }


    Сам код подсчета формулы я писать не стал. Быстрое решение - с использованием eval, но это большое зло. По уму нужно парсить строку и вычислять значение. Возможно вот эта ссылочка сможет помочь stackoverflow.com/questions/18880772/calculate-mat...
    Ответ написан
    2 комментария
  • PHP как правильно работать с JSON?

    @a_ovchinnikov
    Web developer
    Дело в том, что сейчас вы просто записываете в файл содержимое переменной $arr, которая всегда будет одинаковой, независимо от содержимого файла:

    fwrite($fp, json_encode($arr) );

    Правильный алгоритм таков:

    1. Получили содержимое файла;
    2. С помощью функции json_decode сделали из содержимого ассоциативный массив;
    3. Дописали новые данные в конец этого массива;
    4. С помощью функции json_encode из массива снова получили JSON-строку;
    5. Записали результат в файл.

    В целом структура вашего кода очень похожа на то, что я описал. Вероятно, ошибка вот где:

    if(isset($file)){
    $arr = array();
    }
    $arr[count($arr)+1]["name"] = $name;
    $arr[count($arr)]["email"] = $email;
    echo json_encode($arr);


    Вы создали пустой массив, а надо было проинициализировать его данными из файла. Также конструкция echo здесь ни к чему, если конечно только вы не используете ее в тестовых целях.

    Кстати, еще один лайфхак - вставку значения в конец массива можно сделать чуть проще:

    $arr[] = [
        'name' => $name,
        'email' => $email
    ];


    Оператор [] позволяет положить значение в конец массива. В данном случае мы кладем ассоциативный массив.
    Ответ написан
    Комментировать
  • Как сымитировать запрос пользователя к сайту через cURL?

    @a_ovchinnikov
    Web developer
    Политики безопасности браузера пользователя не позволят вам получить Cookie для домена, отличного от текущего.
    Ответ написан
    Комментировать
  • Как показывать языковые версии сайта средставами php?

    @a_ovchinnikov
    Web developer
    А почему Вас не устраивает редирект на уровне веб-сервера? Если используете nginx, то там это сделать не составит никакого труда, а самое главное - будет работать куда быстрее, чем реализация на PHP.
    Ответ написан
    Комментировать