Вопрос или проблема
Я новичок в 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>';
}
Объяснение изменений
- Проверка условия: Мы добавили проверку
is_array($config_mod['category'][$category['id']])
. Это гарантирует, что перед нами массив, перед тем как мы попытаемся использовать его в функцииin_array()
. - Использование
selected
: Мы формируем переменную$selected
, которая получает значениеselected
, только если условие выполнено. Это улучшает читаемость и дебажность кода.
Рекомендации по дополнительной обработке ошибок
С учетом того, что PHP 8 более строг в отношении типов, рекомендуется всегда проверять типы данных, с которыми вы работаете. Регулярно выполняйте такие проверки, чтобы избежать подобных ошибок:
- Используйте
is_array()
для массивов. - Проверяйте переменные на
null
перед их использованием. - Активируйте режим строгой типизации: добавьте
declare(strict_types=1);
в начале вашего PHP файла.
Заключение
Ошибки, связанные с типами данных, станут менее распространенными, если вы будете применять дополнительные проверки и следовать лучшим практикам. Убедитесь, что ваш код хорошо документирован и структурирован — это поможет сохранить его стойкость при обновлениях версий PHP.