1С-Битрикс и PHP 8: Справляємося з помилкою Argument #1 ($value) must be of type Countable|array
Сучасні технології постійно розвиваються, і це часто призводить до виникнення різноманітних помилок при взаємодії різних систем та версій. Одна з таких помилок у системі 1С-Битрикс, зокрема при роботі з PHP версії 8, виглядає ось так:
Argument #1 ($value) must be of type Countable|array, null given (0)
Ця помилка часто з’являється при роботі з функціями, як-от count(), sort(), ksort() та іншими.
Проблема: В коді 1С-Битрикс зустрічаються конструкції типу:
if (count($arResult["ITEMS"]) > 0) {}
Або
if (count($arResult["ITEMS"])) {}
Ці конструкції раніше повертали false, якщо $arResult["ITEMS"] був пустим масивом або взагалі не був визначений. Але тепер, при спробі "порахувати" значення, яке не є Countable або array (наприклад, якщо це ціле число), ви отримаєте помилку.
Рішення:
- Перш за все, потрібно перевірити, чи є змінна "підраховуваною":
if (is_countable($arResult["ITEMS"]) && count($arResult["ITEMS"]) > 0)
Або можна перевірити, чи є це масивом:
if (is_array($arResult["ITEMS"]) && count($arResult["ITEMS"]) > 0)
Таким чином, ми забезпечуємо, що змінна існує, визначена і може бути "підрахована".
- Для функцій сортування, таких як sort(), ksort() і т.д., можна використовувати такий код:
if (is_array($arResult["ITEMS"])) sort($arResult["ITEMS"]);
- Інший варіант - це явне приведення значення до потрібного типу:
$arResult["ITEMS"] = (array)$arResult["ITEMS"];
Або
sort((array)$arResult["ITEMS"]);
Але тут важливо знати, що первинне значення буде приведено до типу Array, що може бути непридатним у певних контекстах.
На завершення, завжди важливо тестувати ваш код після змін, щоб переконатися, що все працює правильно та ефективно.