Для чего нужен второй аргумент в функции count() в PHP?

«Для чего нужен второй аргумент в функции count() в PHP?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Второй необязательный аргумент функции count() (а также sizeof()) — это флаг $mode, который управляет подсчетом элементов в многомерных (вложенных) массивах.

Допустимые значения:

  • COUNT_NORMAL или 0 (значение по умолчанию): Подсчитывает только элементы первого уровня массива.
  • COUNT_RECURSIVE или 1: Рекурсивно подсчитывает все элементы массива, включая элементы во всех вложенных подмассивах.

Пример:

$data = [
    'apple',
    'banana',
    'fruits' => ['orange', 'grape'],
    'berries' => ['strawberry' => ['wild', 'garden'], 'blueberry']
];

echo count($data); // 3 (элементы: 'apple', 'banana', массив 'fruits')
echo count($data, COUNT_NORMAL); // 3 (то же самое)

echo count($data, COUNT_RECURSIVE); // 9
// Подсчет: 'apple'(1), 'banana'(2), 'orange'(3), 'grape'(4),
// 'wild'(5), 'garden'(6), 'blueberry'(7) + сами массивы 'fruits'(8) и 'strawberry'(9)

Важные замечания из практики:

  • Производительность: Использование COUNT_RECURSIVE на очень больших и глубоко вложенных структурах может быть ресурсоемким, так как функция обходит все узлы.
  • Подсчет массивов как элементов: В рекурсивном режиме сами вложенные массивы также учитываются как элементы (+1 к счетчику за каждый массив), что видно в примере выше.
  • Объекты: Для объектов, реализующих интерфейс Countable, функция count() вызовет метод Countable::count(), и второй аргумент будет передан в этот метод. Поведение в этом случае зависит от реализации метода.