Иногда возникает необходимость посчитать некую статистику внутри цикла, чтобы понять, например, сколько таких-то значений встретилось, а сколько таких-то. При этом, конечно же, статистику удобнее всего собирать в массив и там же организовывать счётчики одинаковых значений. Иногда хочется сохранить и сами промежуточные значения, и тогда нужно либо заводить ещё один массив и засовывать значения в него, либо как-то структурировать массив со счётчиками.
В общем, при всей кажущейся тривиальности задачи, до недавнего времени нам приходилось решать её заново как только мы хотим что-то подсчитать. Поэтому мы сделали крайне простую функцию, которая позволяет считать статистику, добавляя в цикл всего одну строку. Кроме того, позволяет копить сразу несколько видов статистики за один проход цикла, что, согласитесь, удобно.
Вот эта коварная функция:
function zstat(&$stat, $name, $data = null) { if (isset($stat[$name])) { $stat[$name][0] ++; } else { $stat[$name] = array(1); } if (isset($data)) { if (isset($stat[$name][1])) { $stat[$name][1][] = $data; } else { $stat[$name][1] = array($data); } } }
В качестве демонстрации можно, например, посчитать статистику по длине слов в тексте-абракадабре, созданном в LoremIpsum-генераторе. И заодно посчитаем общее количество этих слов.
$s = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus tincidunt consequat maximus. Phasellus eget erat venenatis, tincidunt nunc ac, ullamcorper nulla. Nulla facilisi. Duis placerat, nisl vel vehicula suscipit, nisi lorem efficitur dui, sed convallis sem odio ut massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc ac purus vel turpis tempor vehicula. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam nec imperdiet sem. Nunc id eros consectetur massa semper facilisis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque aliquet orci a nunc bibendum, ac aliquam tellus consectetur. Quisque mollis ex eu turpis cursus auctor. Nulla at ornare ante. Ut bibendum nisi vel fringilla fringilla.'; $length_stat = array(); $num_stat = array(); // Пройдёмся по словам foreach (explode(' ', $s) as $w) { zstat($length_stat, strlen($w), $w); // Регистрируем статистику по длине слова и сами слова zstat($num_stat, 'total'); // Регистрируем все слова под ключом 'total', получим просто количество слов } print_r($length_stat); print_r($num_stat);
Эта функция в первый статистический массив соберёт слова по длине и посчитает количество слов такой длины. Выглядеть массив $length_stat будет примерно так:
Array ( [5] => Array ( [0] => 16 [1] => Array ( [0] => Lorem [1] => ipsum [2] => dolor [3] => amet, [4] => elit. [5] => Nulla [6] => lorem [7] => purus [8] => massa [9] => Lorem [10] => ipsum [11] => dolor [12] => amet, [13] => elit. [14] => Nulla [15] => ante. ) ) [3] => Array ( [0] => 13 [1] => Array ( [0] => sit [1] => ac, [2] => vel [3] => sed [4] => sem [5] => Cum [6] => dis [7] => vel [8] => Cum [9] => dis [10] => nec [11] => sit [12] => vel ) ) [11] => Array ( [0] => 4 [1] => Array ( [0] => consectetur [1] => ullamcorper [2] => consectetur [3] => consectetur ) ) ....
В качестве ключа тут выступает длина слова, элемент 0 — это количество слов такой длины, а элемент 1 — это собственно список всех этих слов.
Кстати в массиве $num_stat будет лежать число 166 — это число слов в тексте. Тоже статистика, хотя и очень простая.
Надеюсь, вам или вашим друзьям пригодится данная универсальная функция.