Задать вопрос
  • Как поместить массив в другой массив?

    @ar2rsoft
    PHP-developer
    $create_data = array(
      array(
        'id', 'title', 'description','price', 'condition', 'link','availability', 'image link', 'brand','color', 'size', 'gender','google product category', 'product type',
      ),
    );
    foreach ($arr as $item) {
    $create_data[] = $item; 
    }


    Хотя логичнее, просто в массив arr положить первой строкой заголовки
    Ответ написан
    1 комментарий
  • Как проверить наличие фразы в начале текста php?

    usdglander
    @usdglander Куратор тега PHP
    Yipee-ki-yay
    if (strpos($text, 'id') === 0) {
        //id вначале
    }
    Ответ написан
    Комментировать
  • Как побороть ошибку required parameter $query missing?

    @green_goo
    https://www.php.net/manual/ru/mysqli.query.php
    Обратить внимание на число обязательных аргументов в документации, и сравнить с числом параметров в приведенном коде

    PS. не нужно 1 и тот же запрос выполнять 2 раза.
    Ответ написан
    2 комментария
  • Как вызвать метод родителя в php?

    hack504
    @hack504
    parent::foo()
    Ответ написан
    Комментировать
  • Можно ли сократить код?

    usdglander
    @usdglander Куратор тега PHP
    Yipee-ki-yay
    Вам необходимо познать рекурсию.

    upd
    Когда познаете, нужно будет написать функцию, которая:
    1. Определяет есть ли следующий уровень вложенности и если есть, то выбирает этот уровень и производит вызов самой себя с этим уровнем.
    2. Если следующего уровня нет, то возвращает контент из текущего уровня.
    Ответ написан
    Комментировать
  • Можно ли сократить код?

    @EvgeniiR
    https://github.com/EvgeniiR
    /**
     * @param Text|TextRun $arg
     */
    function printText($arg): void {
      if($arg instanceof TextRun) {
        foreach($arg as $el) { printText($el); }
      } elseif ($arg instanceof Text) {
        echo $arg->getText();
      } else { 
        throw new \InvalidArgumentException('...');
      }
    }
    Ответ написан
    Комментировать
  • Как сделать unit test метода в котором нужен заполненный массив?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    По-хорошему $this->solutions должно устанавливаться через конструктор, потому вам не составит труда заинжектить это состояние в тестируемый объект.

    Если у вас "пришлось", то можете заюзать некий хак, например через рефлексию/closure::bind установить состояние в тестируемый объект.

    Вот на скорую руку накидал (Разместите его в своем TestCase или прямо в тесте)
    protected function setPrivateProperty(object $object, string $propertyName, $value): void
    {
        $reflectionClass = new \ReflectionClass(get_class($object));
        $property = $reflectionClass->getProperty($propertyName);
        
        $property->setAccessible(true);
        $property->setValue($object, $value);
        $property->setAccessible(false);
    }


    ПРИМЕР
    Класс и метод, который нужно протестить и приватная переменная которого заполняется не через конструктор
    class System 
    {
        // Не важно, как оно будет заполнено, важно, 
        // что в методе мы проверяем некоторые значения  
        // и мы создадим ниже в тестах эти ситуации разными тест-кейсами
        private $solutions;
    
        public function checkRecords(): string
        {
            if (count($this->solutions) === 3) {
                return 'full';
            }
    
            if (count($this->solutions) === 6) {
                return 'overflow';
            }
    
            throw new IncorrectCountException('Incorrect solutions count.');
        }
    }


    Тесты
    public function testCheckRecordsFull(): void
        {
            // 3 элемента
            $data = [1, 2, 3];
            $system = new System();
            $this->setPrivateProperty($system, 'solutions',  $data);
    
            $status = $system->checkRecords();
    
            $this->assertEquals('full', $status);
        }
    
        public function testCheckRecordsOverFlow(): void
        {
            // 6 элементов
            $data = [1, 2, 3, 4, 5, 6];
            $system = new System();
            $this->setPrivateProperty($system, 'solutions',  $data);
    
            $status = $system->checkRecords();
    
            $this->assertEquals('overflow', $status);
        }
    
        public function testCheckRecordsIncorrectCOunt(): void
        {
            // сколько-то элементов, но не 3 и не 6
            $data = [1];
            $system = new System();
            $this->setPrivateProperty($system, 'solutions',  $data);
    
            $this->expectException(IncorrectCountException::class);
            $system->checkRecords();
        }

    Код тестовый, просто отобразить принцип, возможно у вас в классе зависимости -- нужно будет сделать моки и т.д. Тут некоторые повторения можно вынести в setUp().
    Также хочу обратить внимание, что тесты построены по принципу ААА (Arrange, Act, Assert).
    Как итог, 3 ситуации, все протестированы, методу не важно, как заполнлась приватная переменная, но вся его логика протестирована. Все легко и просто.
    Ответ написан
    7 комментариев
  • Зачем использовать callback функции?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Крайне хорошее описание по таким вещам есть в Википедии. А теперь к примерам:

    1. Передача параметром
    Такие функции удобно передавать параметром/возвращать из других функций. Тут лучше углубиться в тему: Функция высшего порядка

    Например для удобной передачи асбтрактной функциональности, которая будет применяться например к каждому члену итератора/массива. Это используется например в таких стандартных функциях array_{map/filter/reduce}. В коллбеке то, что будет применяться к каждому члену массива.

    Вообще функции высшего порядка не просто "пример использовани", а даже целая концепция программирования.

    2. Отложенный/ленивый вызов
    Например в PHP приложениях используется в роутерах/контейнере/логере, да много где. Суть в том, что в соллбеке спрятана функциональность, иногда очень большая. Элементов и этих фукцниональности тоже может быть много, а нужно все зарегистрировать. Чтобы не плодить тысячи объектов при регистрации — каждый кусочек функциональности заворачивают в коллбек, и только при вызове (например роута), вызывается коллбек и соответственно все, что в нем начинает работать.

    class Container
    {
         private $callableServices;
    
         public function add(string $serviceName, callable $service)
         {
              $this->callableServices[$serviceName] = $service;
         }
    
         public function get(string $serviceName)
         {
              $service = $this->callableServices[$serviceName];
    
              return $service();
         }
    }
    
    $container = new Container();
    // объект тут не создается, тк он внутри функции, которая не вызывается
    $container->add('a', function() {
         return new FirstBigService();
    });
    // объект тут не создается, тк он внутри функции, которая не вызывается
    $container->add('b', function() {
         return new SecondBigService();
    });
    
    // Внутри метода get() идет не просто доставание нужного элемента, 
    // а еще и его вызов (тк лежат функции), то есть именно сейчас 
    // произойдет new FirstBigService()
    $service = $container->get('a');


    3. Изоляция контекста
    // тут левый код
    ...
    
    // Код ниже работает изолировано и на него ничего не может подействоват,
    // т.к. внутри свой контекст
    (function() {
        $app = new Application();
        $app->run();
    });
    Ответ написан
    Комментировать
  • Какую использовать функцию для выборки из массива?

    Tomio
    @Tomio
    backend developer (python, php)
    $arr = [
    22 => 'one',    
    322 => 'two',   
    42 => 'three',   
    55 => 'four',   
    76 => 'five',   
    21 => 'six',   
    34 => 'seven',   
        ];
    
    $myKeys = [42, 76, 21];
    
    $newArr = array_filter($arr, function($key) use ($myKeys) {
        return in_array($key, $myKeys);
    }, ARRAY_FILTER_USE_KEY);
    
    print_r($newArr);
    /** result
    
    Array
    (
        [42] => three
        [76] => five
        [21] => six
    )
    **/
    Ответ написан
    1 комментарий
  • Ubuntu linux как переместить папку на другой жесткий диск?

    flapflapjack
    @flapflapjack
    на треть я прав
    Нет на линуксах дисков B.

    Напишите сюда вывод lsblk и mount сперва, потом поговорим
    Ответ написан
    1 комментарий
  • Что лучше Phpstorm vs VS code?

    sim3x
    @sim3x
    Phpstorm
    Ответ написан
    Комментировать
  • Как посчитать среднее арифметическое?

    @IS-Builder
    ~ PHP-8 & REGEXP - This is a really powerful kit ~
    Kurper
    к примеру сложить первые три индекса

    Выбираете срез массива, и над ним выполняете арифметические операции:
    $arr = [0 => 12, 1 => 15, 2 => 15, 3 => 75, 4 => 77, 5 => 40, 6 => 15, 7 => 2, 8 => 40, 9 => 11, 10 => 8];
    
    $slice = array_slice($arr, 0, 3);
    $result = array_sum($slice) / sizeof($slice);
    
    echo $result;
    Ответ написан
    1 комментарий
  • Как это называется [в коде]?

    @green_goo
    Это называется говнокод. Извините, не удержался
    Ответ написан
    9 комментариев
  • Как через file_get_contents передать HTTP_USER_AGENT?

    egor_nullptr
    @egor_nullptr
    $opts = [
      'http' => [
        'method' => 'GET',
        'header' => implode("\r\n", ['Accept: *', 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/76.0.3809.132 Edg/44.18362.267.0'])
      ]
    ];
    
    $context = stream_context_create($opts);
    echo file_get_contents('https://www.whatismybrowser.com/', false, $context);
    Ответ написан
    Комментировать
  • Почему код не работает без else?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    При создании окна создаётся Event Dispatch Thread, внутри которого крутится бесконечный цикл, на каждой итерации достающий событие из очереди и запускающий обработчик для него. Бесполезно использовать циклы для изменения интерфейса, так как все изменения просто встанут в очередь и будут выполнены только на одной из следующих итераций цикла событий. А так как ваш бесконечный while работает на порядки быстрее, чем цикл Потока Обработки Событий, очередь событий просто забивается. System.out.println() - операция блокирующая, поэтому её вызов даёт время циклу событий разобрать очередь.
    Ответ написан
    5 комментариев
  • Есть курсы которые оплачивают после трудоустройства?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    практически любые: нужен банк с, желательно, чОткими коллекторами

    https://www.youtube.com/watch?v=s_HItWKBLl4
    Ответ написан
    Комментировать
  • Есть курсы которые оплачивают после трудоустройства?

    Zoominger
    @Zoominger Куратор тега IT-образование
    System Integrator
    Лол, никогда не будет таких курсов, потому что не будет трудоустройства.
    Это ответ.
    Ответ написан
    1 комментарий
  • Можно ли указать два типа для аргумента?

    php666
    @php666
    PHP-макака
    На самом деле вопрос лишен практического смысла.

    PHP в большинстве случаев всем оперирует на уровне строк. Числовые параметры из запроса или из СУБД - всё приходит в виде строк. Числовые типы данных нужны для арифметических операций, значений констант, операций с массивами (хотя и там можно обойтись строками).

    Если для функции РЕАЛЬНО важен передаваемый тип данных, например только int, то и надо передавать int. Точка. И писать явно type hint = int.

    В ином случае просто не надо описывать type hint, а сделать проверку в теле функции/метода:

    if (!is_numeric($var)) throw new Exception....

    Автор же, используя 7 версию и используя подсказки типов, хочет вернуть всё на уровень PHP4, сам не понимая смысла своих действий.
    Ответ написан
    Комментировать
  • Как решать конфликт, если фронт энд разработчик в другом городе, а конфликты на фронте и бэке?

    NikitOS_MV
    @NikitOS_MV
    Король шутов
    Изящнее только покупать билеты и ехать к другому отделу :)
    Ответ написан
    Комментировать