Главная > Программирование > РНР: настольная книга программиста
<< Предыдущий параграф
Следующий параграф >>
<< Предыдущий параграф Следующий параграф >>
Макеты страниц

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 и выше.

<< Предыдущий параграф Следующий параграф >>
Оглавление