Язык программирования PHP | страница 66



>uasort($books,"cmp");

>// сортируем массив с помощью функции cmp

>foreach ($books as $key => $book) {

> echo "$book[0]: \"$key\"
";

>}

>function cmp($a,$b){

>// функция, определяющая способ сортировки

> if ($a[1] < $b[1]) return -1;

> elseif ($a[1]==$b[1]) return 0;

> else return 1;

>}

>?>



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


>Пушкин: "Руслан и Людмила"

>Лермонтов: "Герой нашего времени"

>Толстой: "Война и мир"

>Достоевский: "Идиот"



Мы применили нашу собственную функцию сортировки ко всем элементам массива. Далее рассмотрим, как применить к элементам массива любую другую пользовательскую функцию.


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


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


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


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


>

>$books1 = array(

> "А.С. Пушкин"=>"Руслан и Людмила",

> "Л.Н. Толстой"=>"Война и мир",

> "М.Ю. Лермонтов"=>"Герой нашего времени");

>// создаем функцию, которую хотим

>// применить к элементам массива

>function try_walk($val,$key,$data){

> echo "$data \"$val\" написал $key
";

>}

>// применяем ко всем элементам массива

>// $book1 функцию try_walk

>array_walk($books1,"try_walk","Роман");

>?>



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


>Роман "Руслан и Людмила" написал А.С. Пушкин

>Роман "Война и мир" написал Л.Н. Толстой

>Роман "Герой нашего времени"

> написал М.Ю. Лермонтов



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


>

>$books1 = array(

> "А.С. Пушкин"=>"Руслан и Людмила",

> "Л.Н. Толстой"=>"Война и мир",