Фатальная ошибка: Необработанное исключение TypeError: in_array(): Аргумент #2 ($haystack) должен быть типа array, получено null в php 8 [закрыто]

Вопрос или проблема

Я новичок в PHP и мне нужна помощь с кодом.

У меня есть код

$cats = "";

foreach ($cat_info as $category) {
    $name = ($category['parentid'] ? $cat_info[$category['parentid']]['name'] . "https://stackoverflow.com/" : '') . $category['name'];
    $options = "";

    foreach ($cat_tab as $alt_cat => $cat) {
        $options .= '<option value="' . $alt_cat . '"' . (in_array($alt_cat, $config_mod['category'][$category['id']]) ? ' selected' : '') . '>' . $cat[$gpp_lng].'</option>';
    }

    $cats .= "<tr><td class=\"col-xs-6 col-sm-6 col-md-7 white-line\"><h6 class=\"media-heading text-semibold\">{$name}</h6><span></span></td><td class=\"col-xs-6 col-sm-6 col-md-7 white-line\"><select name=\"config[category][{$category['id']}][]\" style=\"width:100%;max-width:350px;\" class=\"categoryselect\" multiple>{$options}</select></td></tr>";
}

В PHP 7.4 работает хорошо, но когда я пытаюсь выбрать PHP 8, у меня возникает эта ошибка.

Фатальная ошибка: Необработанный TypeError: in_array(): Аргумент #2 ($haystack)
должен быть массивом, null задан в

Кто-нибудь может помочь это исправить?

Ответ или решение

Ошибка Fatal error: Uncaught TypeError: in_array(): Argument #2 ($haystack) must be of type array, null given в PHP 8 указывает на то, что вторым аргументом в функции in_array() передается значение null, тогда как ожидается массив. В PHP 8 была усилена типизация, и поэтому такая ошибка, которая раньше могла просто игнорироваться, теперь приводит к фатальной ошибке.

Давайте шаг за шагом рассмотрим, как исправить эту проблему.

Понимание кода

В предоставленном коде вы пытаетесь проверить, содержится ли значение $alt_cat в массиве, который строится из переменной $config_mod['category'][$category['id']]. Проблема может заключаться в том, что на момент выполнения кода $config_mod['category'][$category['id']] оказывается равным null или неинициализированной переменной, что и вызывает ошибку.

Решение проблемы

Вы можете добавить проверку на то, что переменная действительно является массивом, прежде чем передавать её в функцию in_array(). Это можно сделать с помощью функции is_array(). Если переменная не инициализирована или равна null, вы можете передать пустой массив вместо этого. Вот как это можно изменить:

$cats = "";

foreach ($cat_info as $category) {
    $name = ($category['parentid'] ? $cat_info[$category['parentid']]['name'] . "https://stackoverflow.com/" : '') . $category['name'];
    $options = "";

    foreach ($cat_tab as $alt_cat => $cat) {
        // Проверяем, является ли $config_mod['category'][$category['id']] массивом
        $selected = (is_array($config_mod['category'][$category['id']]) && in_array($alt_cat, $config_mod['category'][$category['id']])) ? ' selected' : '';
        $options .= '<option value="' . $alt_cat . '"' . $selected . '>' . $cat[$gpp_lng] . '</option>';
    }

    $cats .= '<tr><td class="col-xs-6 col-sm-6 col-md-7 white-line"><h6 class="media-heading text-semibold">' . $name . '</h6><span></span></td><td class="col-xs-6 col-sm-6 col-md-7 white-line"><select name="config[category][' . $category['id'] . '][]" style="width:100%;max-width:350px;" class="categoryselect" multiple>' . $options . '</select></td></tr>';
}

Объяснение изменений

  1. Проверка условия: Мы добавили проверку is_array($config_mod['category'][$category['id']]). Это гарантирует, что перед нами массив, перед тем как мы попытаемся использовать его в функции in_array().
  2. Использование selected: Мы формируем переменную $selected, которая получает значение selected, только если условие выполнено. Это улучшает читаемость и дебажность кода.

Рекомендации по дополнительной обработке ошибок

С учетом того, что PHP 8 более строг в отношении типов, рекомендуется всегда проверять типы данных, с которыми вы работаете. Регулярно выполняйте такие проверки, чтобы избежать подобных ошибок:

  • Используйте is_array() для массивов.
  • Проверяйте переменные на null перед их использованием.
  • Активируйте режим строгой типизации: добавьте declare(strict_types=1); в начале вашего PHP файла.

Заключение

Ошибки, связанные с типами данных, станут менее распространенными, если вы будете применять дополнительные проверки и следовать лучшим практикам. Убедитесь, что ваш код хорошо документирован и структурирован — это поможет сохранить его стойкость при обновлениях версий PHP.

Оцените материал
Добавить комментарий

Капча загружается...