Ответы пользователя по тегу PHP
  • Match не возвращает значения?

    Рабочий вариант:
    function select($a): callable{
      
      return match($a){
      1 => function($b, $c) { return $b + $c; },
      2 => function($b, $c) { return $b - $c; },
      3 => function($b, $c) { return $b * $c; },
      };
    
    }
    Ответ написан
    Комментировать
  • Почему не работает вложенное пространство имен?

    Я считаю, что ответ в следующем: автор статьи неправ. К сожалению, в статье отсутствует дата публикации; возможно, такой синтаксис работал какое-то время, а потом его отменили. Мануал на эту тему категоричен:
    импортируемые имена должны быть абсолютными и не обрабатываются относительно текущего пространства имён.


    Возможно, автор статьи имел в виду вот это:
    namespace MyCompany\classes
    {
        $myClass1 = new addons\MyClass1();
    }
    
    namespace MyCompany\classes\addons
    {
        class MyClass1
        {
            function __construct()
            {
                echo 'MyClass1 создан.';
            }
        }
    }
    Ответ написан
    2 комментария
  • Как сортировать массив?

    Вы смешали наполнение массива и сортировку. Не надо так. Сначала заполняете массив, а потом сортируете.

    * я знаю про всякие олимпиадные задачки, но это не тот случай
    Ответ написан
    Комментировать
  • Fatal error: require_once() [function.require1]: Failed opening required 'minify/cssmin.class.php'?

    Нет, не так. Предполагаю, что у Вас в файле minify.php в 7 строке прописан относительный путь, что-то вроде require_once 'minify/cssmin.class.php';
    Относительный путь считается от текущего рабочего каталога, смотрите getcwd().
    Файл cssmin.class.php не находится, require_once возвращает ошибку. Формирование на лету сжатого файла - это другое.
    Ответ написан
    Комментировать
  • Сохранение сессий в базе данных?

    Похоже, Вы не совсем понимаете механизм сессий. Да, на стороне клиента хранится только id. Но на стороне сервера могут храниться произвольные данные, ассоциированные с этим id.
    Получается, что в этом случае не нужно создавать сессию в PHP с помощью session_start()?

    Если Вы собираетесь полностью заменять встроенный механизм сессий на свой, то не нужно. Но этот подход не кажется достаточно обоснованным; посмотрите сначала на https://www.php.net/manual/en/function.session-set...
    Ответ написан
  • Как выбрать нужные записи из бд?

    Попробуйте
    (SELECT * FROM mytable WHERE user_id IS NOT NULL LIMIT 1)
    UNION
    (SELECT * FROM mytable WHERE id = (SELECT MAX(id) FROM mytable ) )
    LIMIT 1
    Ответ написан
    Комментировать
  • Везде ли нужно проверять на существование элемента в массиве?

    иногда такие проверки бессмысленны. Допустим, Вы обращаетесь к функции, которая возвращает список, каждый элемент которого - массив определённой структуры, например ['id'=> ..., 'name' => ..., 'timestamp'=> ...,]
    Понятно, что не надо у каждого элемента проверять, есть ли там эти ключи - функция-источник гарантирует это.
    Ответ написан
    Комментировать
  • Как составить все возможные сочетания из элементов разных массивов размером N?

    составить универсальный код сходу не получилось. Думаю, надо составлять код динамически, через create_function().
    Для случая двух элементов вот код:
    $sources = [
        ['A', 'B', 'C',],
        [1, 2, 3, 4, 5, 6,],
        ['X', 'Y', 'W', 'Z'],
        ['1X', '2Y', '3W', '4Z'],
    ];
    function combine_by_two( $source ) {
        $result = [];
        // нужно, чтобы было хотя бы 2 массива-источника
        while ( count($source) > 1 ) {
            /**
             * AFAIK, технически легче оперировать с последним элементом, а не первым
             * (что привычнее для человека)
             */
            $primary = array_pop($source);
            $linearizedArray = call_user_func_array("array_merge", $source);
            foreach ($primary as $primaryItem) {
                foreach ($linearizedArray as $secondaryItem) {
                    $result[] = [$primaryItem, $secondaryItem];
                }
            }
            // повторяем с усечённым массивом
            $result += combine_by_two($source);
        }
        return $result;
    }
    
    $combined = combine_by_two($sources);
    Ответ написан
  • Как передать ошибку пользователю из класса?

    ПО-моему, исключения обычно используют по-другому: в одном месте их кидают, а в другом - ловят. Вот вам пример:
    class A {
    
        /**
         * A constructor.
         * @throws Exception
         */
        public function __construct()
        {
            // $cnt откуда-то берется...
            $cnt = 0;
            if ( $cnt < 1 ) {
                throw new Exception("нулевое количество");
            }
        }
    }
    
    class B {
    
        private $errors = array();
    
        public function run()
        {
            try {
                $a = new A();
            } catch (Exception $e) {
                $this->errors[] = $e->getMessage();
            }
    
            return array("errors"=>$this->errors);
        }
    }

    Если по какой-то причине нельзя кидать исключение из конструктора ( уже не помню, но может быть для старых версий PHP это было плохо), то просто выносите код инициализации объекта в другой метод, а конструктор делаете пустым:
    class A {
        /**
         * A constructor.
         */
        public function __construct()
        {
        }
    
        /**
         * @throws Exception
         */
        public function init()
        {
            // $cnt откуда-то берется...
            $cnt = 0;
            if ( $cnt < 1 ) {
                throw new Exception("нулевое количество");
            }
        }
    }
    
    class B {
    
        private $errors = array();
    
        public function run()
        {
            try {
                $a = new A();
                $a->init();
            } catch (Exception $e) {
                $this->errors[] = $e->getMessage();
            }
    
            return array("errors"=>$this->errors);
        }
    }
    Ответ написан
    1 комментарий
  • Как работает функция построения дерева?

    судя по распечатке массива, где-то ошибка: функция предполагает, что в неё передаётся хэш ( то есть массив, у которого ключи - значимы), а у вас приведён список ( ключи не несут информации ).
    Может, поэтому и непонятен результат работы функции. $arr должен быть таким:
    $arr = [685 => [
        'id' => 685,
        'title' => 'Комплектующие к Apple',
        'parent' => 0
      ],
      691 => [
        'id' => 691,
        'title' => 'Запчасти к iPad',
        'parent' => 685
      ],
      692 => [
        'id' => 692,
        'title' => 'Запчатси к iPhone',
        'parent' => 681
      ]
    ];

    Плюс в последнем элементе подозрительное значение у ключа parent ( больше подходит 685 ).
    Ответ написан
    Комментировать
  • Как сделать уведомление об отправке почты?

    У вас в коде не видно элемента с id result_id.
    Видимо, тут ошибка: AjaxFormRequest('result_id', 'f01', 'mail_to.php')
    Такие вещи отлично решаются с помощью дебага в браузере (Sources в Хроме, Debugger в Firefox). Ставите брекпойнт, пошагово двигаетесь и смотрите на всё подозрительное через watch expression.
    Ответ написан
    Комментировать
  • Как в битриксе добавить значение в множественное свойство элемента?

    Самый очевидный вариант - сначала считать старые данные (например, через CIBlockElement::GetProperty() ). Насколько помню, сами битриксоиды в админке делают так же.
    Ответ написан
    Комментировать
  • Импорт CSV в публичной части сайта на Bitrix

    конечно, за счёт API. Классы CIBlockSection, CIBlockElement, CCatalogProduct и CPrice.
    У стандартной php-шной fgetcsv() вроде бы есть какие-то ограничения, но можно взять аналог от Дмитрия Котерова либо свой велосипед сколхозить.
    Ответ написан
  • Как узнать количество одинаковых значений в массиве?

    исправленный вариант:
    $res = mysql_query("SELECT model FROM tech WHERE tech_cat='{$cat_id}'");
    $models = array();
    while ( $row = mysql_fetch_assoc($res) ) {
        $models[] = $row['model'];
    }
    print_r($models);
    print_r(array_count_values($models));
    Ответ написан
    1 комментарий
  • Как реализовать бесконечный скроллинг (infinity scroll) для инфоблоков Битрикса?

    по js-части подсказать не могу ( как-то отследить скороллинг, в нужный момент сделать ajax-запрос; не думаю, что это сложно). Ответ бэкенда ожидаете в формате html

    Бэкенд для аякса предлагаю делать в отдельном файлике:
    <?
    // это строчки - обычный набор для отдельной аяксовой страницы;
    // тут исключен вывод шаблона сайта (хедера и футера), только рабочая область
    define("NO_KEEP_STATISTIC", true);
    define("NOT_CHECK_PERMISSIONS", true);
    
    require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");?>
    // сюда закидывается вызов компонента списка новостей с исходной страницы
    <?
    require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");
    ?>

    Стоит проверить, что шаблон сайта для ajax-страницы - тот же, что и для исходной.
    Сама постраничка делается через GET-параметр PAGEN_?, номер в конце зависит от того, сколько компонентов с постраничкой на данной странице. То есть если Вы будете отправлять post-запрос, то надо будет до prolog_before запихнуть параметр постранички в $_GET
    Ответ написан
    Комментировать