Вероятно, одним из наиболее интересных свойств массивов РНР является возможность ассоциировать их с функциями обратного вызова. Что же представляют собой функции обратного вызова и как они используются с массивами? Функции обратного вызова создаются вами (разработчиком), а затем вызываются изнутри РНР для выполнения манипуляций определенного назначения. В данном случае функции обратного вызова массивов создаются для модификации содержимого массивов методом "значение за значением". Чтобы лучше понять функции обратного вызова массивов, рассмотрим примеры кода, реализующего их. Первой такой функцией будет array_map(). Эта функция, возможно, наиболее близка к функциям обратного вызова, доступным разработчику РНР. Она принимает не менее двух параметров: первый — это строка (или массив, если обратный вызов выполняется из объекта), содержащая имя функции обратного вызова, а каждый последующий параметр является одним (или более) параметром, как показано ниже: array_map($callback, $array_varl [, $array_var2, ...]) Когда вы создаете свою функцию обратного вызова, вам нужно знать, сколько параметров она должна принимать. Обычно вам понадобится столько параметров, сколько массивов вы хотите передать в array_map(). Поэтому если вы передаете два массива array_map(), планируйте свою функцию так, что она должна будет принять два параметра. Взглянем на небольшой фрагмент кода, представленный в листинге 2.9.
Листинг 2.9. Использование функции array_map() function my_callback($var) { echo "Значение: $var "; return strtoupper($var); } $myarray = array("Поздравляем", "это", "обратный", "вызов!"); $newarray = array_map("my_callback", $myarray); echo " "; print_r($newarray) ; echo " ";
НА ЗАМЕТКУ Теперь, когда мы имеем дело с массивами, следует обратить внимание на использование функции p r i n t _ r (). Эта функция довольно симпатично выводит содержимое массива, переданного ей в параметре (в том числе и многомерного массива). Однако этот вывод не вполне предназначен для просмотра в Web-браузере. Отсюда и необходимость поместить его в пару HTML-дескрипторов .
Поскольку этот код не совсем очевиден, разберем его работу более детально. Если пока не обращать внимания на функцию, видно, что здесь создается массив $myarray, после чего вызывается функция array_map (). Когда она вызывается, то проходит по всем элементам переданного ей массива (в данном случае $myarray) и вызывает указанную вами функцию my_callback (), передавая ей индивидуальное значение каждого элемента и создавая новый массив из элементов, возвращаемых вашей функцией обратного вызова. Функция обратного вызова сначала отображает переданный ей элемент, а затем возвращает его преобразованным в символы верхнего регистра с помощью PHP-функции strtoupper (). То есть, после выполнения этого сценария в результате получается новый массив $newarray, идентичный исходному массиву $myarray, но с элементами-строками в верхнем регистре.
Так выглядит вывод, полученный из данного сценария: Значение: Поздравляем Значение: это Значение: обратный Значение: вызов! Array [0]=>ПОЗДРАВЛЯЕМ [1]=>ЭТО [2]=>ОБРАТНЫЙ [3]=>ВЫЗОВ!
НА ЗАМЕТКУ Функции обратного вызова не обязательно должны быть пользовательскими. Фактически, в предыдущем примере, если вам не нужен вывод информации клиенту, вы могли просто определить в качестве функции обратного вызова стандартную функцию strtoupper () и получить тот же результат.
Аналогично функция array_map () может использоваться с множеством массивов, как показано в листинге 2.10.
Листинг 2.10. Использование функции array_map() function mul_callback($x, $y) { return $x * $y; } $numbers_l = array (2, 4, 5) ; $numbers_2 = array (3, 4, 5); $answer = array_map("mul_callback", $numbers_l, $numbers_2); print_r($answer); ?>
В данном случае вы используете два массива ($numbers_l и $nurabers_2) вместе с функцией array_map() для выполнения простого вычисления и помещения результата в другой массив. Ожидаемый вывод будет выглядеть так:
Array { [0] => 6 [1] => 16 [2] => 25
НА ЗАМЕТКУ Кстати, при использовании функции array_map () с более чем одним массивом, вовсе не обязательно, чтобы они совпадали по размеру. Если массивы различны по длине, то соответствующая переменная, которая будет передана функции обратного вызова, когда более короткий из них "закончится", просто будет пустой.
Теперь, когда вы получили некоторое представление о работе функций обратного вызова, рассмотрим ряд других PHP-функций, предназначенных для работы с массивами, которые также используют модель обратного вызова. Следующая функция применяется для эффективной фильтрации значений массива на базе возвращаемого значения вашей функции обратного вызова — это функция a r r a y f i l t e r О . В отличие от ранее рассмотренной функции arraymapO, array_filter () имеет слегка отличающийся (обратный) синтаксис: array_filter($input, $callback) $input — это входной массив, a $callback — функция обратного вызова, которая с ним работает. Как и в случае с array_map (), array_f i l t e r () проходит по каждому из элементов массива и передает его в нужную функцию обратного вызова. Однако, в отличие от случая с arraymap (), функция обратного вызова, переданная array filter (), должна возвращать булевское значение. Если она возвратит false, то переданный ей параметр не будет включен в массив, возвращаемый array_f i l t e r (). Конечно, если функция обратного вызова вернет true, то значение будет включено в возвращаемый массив. В листинге 2.11 эта концепция иллюстрируется использованием array_f i l t e r () для выделения всех целых элементов массива, значение которых больше или равно 10.
Листинг 2.11. Использование функции a r r a y _ f i l t e r () function filter_values($value) { if($value > 10) return true; return false; } $myints = array{123,54,2,3,42,23,4,2,12); $filtered = array^filter($myints, "filter_values"); print_r($filtered); ?>
Как и можно было ожидать, в результате выполнении этого сценария будет создан новый массив $filtered, содержащий значения 123, 52, 42, 23 и 12. Следует отметить, что при работе функций array_f i l t e r () и array_map() под- держивается исходное отношение ключей. Это значит, что массив $filtered из листинга 2.11 будет содержать целый ключ 4, значение которого равно 42 — даже несмотря на то, что некоторые элементы исходного массива $myints будут удалены. Не все функции поддерживают отношения ключей, поэтому важно обращаться к руководству по РНР и выяснять, когда такое поведение желательно.
|