20.4. Применение вызовов в PHP
Данные функции необходимы для того, чтобы программист мог без проблем передавать переменные имеющегося массива в указанную функцию. После работы функции она возвращает новое значение, которое потом записывается в новый массив. Этим и занимается функция array_map(). Элементарный синтаксис данной функции:
array array_map(mixed callback, array arr1 [, array arr2...])
Как видно, она возвращает новый массив переменных. Более конкретно это выглядит следующим образом: строка mixed callback задает имя функции, через которую будут обрабатываться в последовательном порядке значения массива. Строки array arr1 [,array arr2...] задают именно те массивы, т.е. ихимена, из которых и будут браться те самые переменные. Например, имеем массив, состоящий из двух элементов: 1,2, и функцию, которая будет просто умножать эти значения на два, так вот массив, который вернет данная функция, будет иметь другое имя и следующие значения: 2,4.
Рассмотрим программу, которая будет умножать на три каждый из элементов нашего массива и при этом создаст новый массив:
<?
function sum($n) {
return $n*3;
}
$a = array(1, 2, 3, 4, 5);
$b = array_map(sum, $a);
?>
В данном примере последовательно будут вноситься значения массива и умножаться на 3, далее будет создан сам массив $b = array (3, 6, 9, 12, 15);.
ВНИМАНИЕ
Эта функция работает в самых новых версиях РНР. Поэтому она не работает в таких, как РНР 3 или РНР 4 бета-версиях.
Чтобы совершить работу не с одним, а с двумя массивами, необходимо использовать следующие принципы построения кода. Пример поможет вам познакомиться с этими принципами:
function show_Spanish($n, $m) {
return "The number $n is called $m in Spanish";
}
function {
return array ($n => $m);
}
$a = array(1, 2, 3, 4, 5);
$b = array("uno", "dos", "tres", "cuatro", "cinco");
$c = array_map("show_Spanish", $a, $b) ;
print_r($c);
//результат данной работы данной программы приведен ниже: // Array
// (
// [0] => The number 1 is called uno in Spanish
// [1] => The number 2 is called dos in Spanish
// [2] => The number 3 is called tres in Spanish
// [3] => The number 4 is called cuatro in Spanish
// [4] => The number 5 is called cinco in Spanish
// )
$d = array_map("map_Spanish", $a, $b);
print_r($d);
Результат работы:
array([0] => array([1] => uno) [1] = > array([2] => dos) [2] => array([3] => tres) [3] => array([4] => cuatro) [4] => array([5] => cinco))
Обычно при использовании двух или более массивов они должны иметь равную длину, потому что функция повторного вызова применяется параллельно к соответствующим элементам. Если массивы имеют неравную длину, самый короткий будет продлен при помощи пустых элементов, т. е. будет заполнен пустыми элементами.
Следующий пример показывает принцип работы данной функции с тремя массивами:
$а = array(1, 2, 3, 4, 5);
$b = array("one", "two", "three", "four", "five");
$c = array("uno", "dos", "tres", "cuatro", "cinco");
$d = array_map(null, $a, $b, $c);
print_r($d);
Результат:
Array([0] => Array([0] => 1[1] => one[2] => uno) [1] =>
Array(
[0] => 2[1] => two [2] => dos) [2] => Array( [0] => 3
[1] => three[2] => tres) [3] => Array([0] => 4[1] => four
[2] => cuatro) [4] => Array([0] => 5[1] => five[2] => cinco) )
Существует еще две функции, аналогичные по принципу работы array_map(). Первая из них array_filter. Ее синтаксис:
array array_filter(array input [, mixed callback])
Данная функция возвращает массив элементов, т. е. новый массив, при условии, что каждый элемент был обращен к заданной функции. После этого над ним производятся операции и он либо входит в новый массив, либо нет. Например, нужно выбрать из массива элементы значений, остаток от деления на два которых равен единице, или что-нибудь в этом роде. Так происходит формирование массива. Пример работы данной функции:
function foo($var) {
return($var % 2 == 1);
}
function foos($var) {
return ($var % 2 == 0);
}
$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array(23, 24, 25, 26, 27, 28, 29, 30);
$odd = array_filter($array1, "foo");
$even = array_filter($array2, "foos");
Как видно из примера, в первом случае создается массив, содержащий элементы массива $array1, делящиеся на 2 с остатком, равным 1. И результат будет следующий:
$odd = array("а"=>1, "с"=>3, "е"=>5);
Во втором случае создается массив со значениями из массива все значения которого делятся на 2 без остатка, все остальные значения отбрасываются. Результат программы:
$even = array(24, 26, 28, 30)
ВНИМАНИЕ
Если работа осуществляется с ассоциативным массивом, то при работе функции array_filter() также возвращается массив значения с указателями.
Следующая функция, которую нам необходимо рассмотреть, — array_reduce(). Синтаксис:
mixed array_reduce(array input, mixed callback [, int initial])
Этот массив вызывает постоянное значение, т. е. просто число, в соответствии с условиями, заданными в параметре callback. Массив, с которого будет осуществляться процесс вызова значений, указывается в input. В строку int initial заносятся те значения, которые вы совместно со значениями массива хотели бы внести в функцию callback. Пример работы данной функции:
<?
function rsum($v, $w) {
$v += $w;
return $v;
}
function rmul($v, $w) {
$v *= $w;
return $v;
}
$а = array(1, 2, 3, 4, 5);
$х = array();
$b = array_reduce($a, "rsum");
$с = array_reduce($a, "rmul", 10);
$d = array_reduce($x, "rsum", 1);
?>
Результатом работы данного примера будут следующие значения переменных:
$b = 1+2+3+4+5 = 15
$с = 1*2*3*4*5*10 = 1200
$d = 1
Рассмотрим еще одну функцию — array_walk. Она производит добавление каждого значения массива в используемую функцию. Ее синтаксис:
int array walk(array arr, string func, mixed userdata)
Данная функция работает с последовательностью значений указанного массива arr, в строке func задается сама функция и третий параметр, который будет вводиться в функцию для обработки данных (первые два — это указатель и само значение).
Если func требует больше, чем два или три параметра (в зависимости от userdata), всегда будет выдаваться ошибка при вызове функцией array_walk(), указанной func. Эти предупреждения могут быть подавлены знаком @, запросом к функции array_walk() или при помощи error_reporting().
ВНИМАНИЕ
Если func должна работать с фактическими величинами матрицы, необходимо определить ее первый параметр при помощи func путем пропуска ссылкой. Тогда любые изменения элементов будут сделаны непосредственно в самом массиве.
Передачи указателя и userdata в func были добавлены в PHP 4.0. Функция func работает в РНР 3 и выше.