Ответ
Второй необязательный аргумент функции 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(), и второй аргумент будет передан в этот метод. Поведение в этом случае зависит от реализации метода.