Применение функции ко всем элементам массива

Функция array_walk(массив, функция [, данные]) применяет созданную пользователем функцию ко всем элементам массива массив и возвращает true в случае успешного выполнения операции и false – в противном случае.

Пользовательская функция, как правило, имеет два аргумента, в которые поочередно передаются значение иключ каждого элемента массива. Но если при вызове функции array_walk() указан третий аргумент, то он будет рассмотрен как значение третьего аргумента пользовательской функции, смысл которого определяет сам пользователь. Если функция пользователя требует больше аргументов, чем в нее передано, то при каждом вызове array_walk() будет выдаваться предупреждение.

Если необходимо работать с реальными значениями массива, а не с их копиями, следует передавать аргумент в функцию по ссылке. Однако нужно иметь в виду, что нельзя добавлять или удалять элементы массива и производить действия, изменяющие сам массив, поскольку в этом случае результат работы array_walk()считается неопределенным.

<?php$books1 = array( "А.С. Пушкин"=>"Руслан и Людмила", "Л.Н. Толстой"=>"Война и мир", "М.Ю. Лермонтов"=>"Герой нашего времени");// создаем функцию, которую хотим // применить к элементам массива function try_walk($val,$key,$data){ echo "$data \"$val\" написал $key<br>";}// применяем ко всем элементам массива // $books1 функцию try_walkarray_walk($books1,"try_walk","Роман");?>

В результате работы скрипта получим:

Роман "Руслан и Людмила" написал А.С. ПушкинРоман "Война и мир" написал Л.Н. ТолстойРоман "Герой нашего времени" написал М.Ю. Лермонтов

Заметим, что мы не изменили значений у элементов массива. Чтобы их изменить, надо было передавать значения в переменную $val функции try_walkпо ссылке.

<?php$books1 = array( "А.С. Пушкин"=>"Руслан и Людмила", "Л.Н. Толстой"=>"Война и мир", "М.Ю. Лермонтов"=>"Герой нашего времени");// создаем функцию, которую хотим // применить к элементам массива function try_walk(&$val,$key){ $key = "<p>Автор: " .$key ."<br>"; $val = "Название: \"" . $val ."\"</p>"; echo $key.$val;}// применяем ко всем элементам массива // $book1 функцию try_walk array_walk($books1,"try_walk");print_r($books1);?>

В результате работы скрипта получим:

Автор: А.С. ПушкинНазвание: "Руслан и Людмила"Автор: Л.Н. ТолстойНазвание: "Война и мир"Автор: М.Ю. ЛермонтовНазвание: "Герой нашего времени"Array ( [А.С. Пушкин] => Название: "Руслан и Людмила" [Л.Н. Толстой] => Название: "Война и мир" [М.Ю. Лермонтов] => Название: "Герой нашего времени")

Выделение подмассива

Функция array_slice

Поскольку массив – это набор элементов, вполне вероятно, потребуется выделить из него какой-нибудь поднабор. В PHP для этих целей есть функция array_slice. Ее синтаксис таков:

array_slice (массив, номер_элемента [, длина])

Эта функция выделяет подмассив длины длина в массиве массив, начиная с элемента, номер которого задан параметром номер_элемента. Положительный номер_элемента указывает на порядковый номер элемента относительно начала массива, отрицательный – на номер элемента с конца массива.

<?php$arr = array(1,2,3,4,5);$sub_arr = array_slice($arr,2);print_r($sub_arr); /* выведет Array ( [0] => 3 [1] =>4 [2] => 5 ),т.е. подмассив, состоящий из элементов 3, 4, 5 */$sub_arr = array_slice($arr,-2);print_r($sub_arr); // выведет Array ( [0] => 4 [1] => 5 ), // т.е. подмассив, из элементов 4, 5?>

Если задать параметр длина при использовании array_slice, то будет выделен подмассив, имеющий ровно столько элементов, сколько задано этим параметром. Длину можно указывать и отрицательную. В этом случае интерпретатор удалит с конца массива число элементов, равное модулю параметра длина.

<?php$arr = array(1,2,3,4,5);$sub_arr = array_slice($arr, 2, 2); // содержит массив из элементов 3, 4$sub = array_slice($arr,-3, 2); // тоже содержит массив из элементов 3, 4$sub1 = array_slice($arr,0, -1); // содержит массив из // элементов 1, 2, 3, 4$sub2 = array_slice($arr,-4, -2); // содержит массив из элементов 2, 3?>

Функция array_chunk

Есть еще одна функция, похожая на array_slice() – это array_chunk(). Она разбивает массив на несколько подмассивов заданной длины. Синтаксис ее такой:

array_chunk ( массив, размер [, сохранять_ключи])

В результате работы array_chunk() возвращает многомерный массив, элементы которого представляют собой полученные подмассивы. Если задать параметр сохранять ключи как true, то при разбиении будут сохранены ключи исходного массива. В противном случае ключи элементов заменяются числовыми индексами, которые начинаются с нуля.

ПримерУ нас есть список приглашенных, оформленный в виде массива их фамилий. У нас имеются столики на три персоны. Поэтому нужно распределить всех приглашенных по трое.

<?php$persons = array("Иванов", "Петров", "Сидорова","Зайцева", "Волкова");$triples = array_chunk($persons,3); // делим массив на подмассивы // по три элементаforeach ($triples as $k => $table){ // выводим полученные тройки echo "За столиком номер $k сидят: <ul>"; foreach ($table as $pers) echo "<li>$pers"; echo "</ul>";}?>

В результате получим:

за столиком номер 0 сидят:• Иванов• Петров• Сидороваза столиком номер 1 сидят:• Зайцева• Волкова

Сумма элементов массива

В этом разделе мы познакомимся с функцией, вычисляющей сумму всех элементов массива. Сама задача вычисления суммы значений массивапредельно проста. Но зачем писать лишний раз один и тот же код, если можно воспользоваться специально созданной и всегда доступной функцией. Функция эта называется, как можно догадаться, array_sum(). И в качестве параметра ей передается только имя массива, сумму значений элементовкоторого нужно вычислить.

В качестве примера использования этой функции приведем решение более сложной задачи, чем просто вычисление суммы элементов. Этот пример также иллюстрирует применение функции array_slice(), которую мы обсуждали чуть раньше.

Пример.Пусть дан массив натуральных чисел. Нужно найти в нем такое число, что сумма элементов справа от него равна сумме элементовслева от него.

<?php//массив задается функцией array$arr = array(2,1,3,4,5,6,4);// перебираем каждый элемент массива $arr.// Внутри цикла текущий ключ массива // содержится в переменной $k,// текущее значение – в переменной $valforeach ($arr as $k => $val){ $p = $k + 1;// синтаксис array array_slice (// array array,int offset [,int length])// array_slice выделяет подмассив // длины length в массиве array, // начиная с элемента offset. $out_next = array_slice($arr,$p); // получаем массив элементов, // идущих после текущего $out_prev = array_slice($arr,0,$k); // получаем массив элементов, // идущих перед текущим// функция mixed array_sum (array array) // подсчитывает сумму элементов массива array $next_sum = array_sum($out_next); $prev_sum = array_sum($out_prev);// если сумма элементов до текущего равна // сумме элементов после, то выводим // значение текущего элемента if ($next_sum==$prev_sum) echo "value:$val";// можно посмотреть, что представляют собой // рассмотренные массивы на каждом шаге// print_r($out_next); echo "<br>";// print_r($out_prev);// echo "$next_sum, $prev_sum<br>"; echo "<hr>";}?>