Основные функции работы с массивами
Сортировка массивов
Дополнительные функции работы с массивами
В этой главе мы рассмотрим функции, которые позволяют эффективно использовать как обычные, так и ассоциативные массивы. Я думаю, нет нужды заново повторять избитые истины и объяснять читателю, что представляют собой массивы.
В конце концов, сегодня информатику проходят уже в школе.
Отметим лишь, что в РНР поддерживаются как одномерные, так и многомерные массивы и что массивы могут создаваться либо самим пользователем, либо системными или пользовательскими функциями.
В первом разделе мы рассмотрим специализированные функции, специально созданные для работы с массивами. Все их имена начинаются со специального префикса— аrrау_.
8.1.1. Создание массива: array
array array ([mixed ...])
Функция предназначена для создания массивов с заданными пользователем характеристиками. Возвращает массив, содержимое которого определяется параметрами функции (о них сМ. ниже). Параметры могут вводиться одновременно с индексами массива с помощью оператора =>.
внимание
Аrrау () является специальной конструкцией языка, предназначенной для литерального ввода и представления массивов, а не обычной функцией РНР.
Применение записей index => values, разделенных запятыми, позволяет задать
пары «ключ-значение», пригодные для ввода как обычных, так и ассоциативных
массивов. В том случае, когда индекс не используется, он генерируется автоматически, причем первый элемент массива получает индекс, равный 0. Если индекс
представляет собой число, то следующий индекс, если он будет сгенерирован автоматически, будет равен максимальному уже определенному индексу плюс 1.
совет
Если, паче чаяния, вы введете два одинаковых индекса, последняя пара (ведь индекс всегда вводится со значением) перекроет предыдущий.
В приведенном ниже примере показывается, как легко и непринужденно создается двухмерный массив, как можно задать ключи для ассоциативного массива, а также как пропустить несколько индексов при создании обычных массивов:
// Создание обычного массива
$fruits = array (
"фрукты" => array ("а"=>"апельсмн", "b"=>"груша", "с"=>"арбуз"),
"числа" => array (I, 2. 3, 4, 5, 6),
, "дырявый" => array ("раз", 5 => "два", "три")
);
А вот пример автоматической генерации индексов:
$array = array( 1. 1, 1, 1, 1, 8=>1, 4=>1, 19, 3=>13);
print_r($array);
который приведет к выводу на печать:
Array
(
[0] => 1
[1] =>
[2] => 1
[3] => 13
[4] => 1
[8] => 1
[9] => 19
Обратите внимание, что в программе элемент с. индексом 3 определяется дважды,
а в результирующем массиве такой элемент только один и его значение определяется последним включением элемента (13). Индекс 4 был определен после индекса 8, но автоматически сгенерированный после этого элемента следующий индекс
равен 9.
А теперь мы создадим массив в стиле Фортрана, в котором нумерация элементов
начинается с 1:
$первый_квартал = аrrау(1 => 'Январь', 'Февраль', 'Март' );
pri nt_r ($первый_квартал);
который приведет к выводу на печать:
Array
(
[1] => 'Январь'
[2] => 'Февраль'
[3] => 'Март'
)
Обратите также внимание на функцию 1ist () (раздел 8.3.10).
8.1.2. Подсчет количества элементов: array_count_values
array array_count_values (array input)
Функция array_count_values() возвращает массив, в котором ключами являются элементы массива, а количество их встречаемости в массиве - значениями,
ассоциированными с этими ключами.
$array = array (1, "hello", 1, "world", "hello");
$gistogramma = array_count_values ($array);
// вернет массив (,1=>2, "hello"=>2, "world"=>l)
8.1.3. Различия между массивами: array_diff
array array_diff (array arrayl, array array2 [ array ...] )
Функция array_di f f () возвращает массив, в котором содержатся значения массива arrayl, отсутствующие в любом из остальных аргументов, которые также
должны быть массивами. При этом значения ключей первого массива сохраняются без изменений.
$arrayl = array ("a" => "зеленый", "красный", "синий");
$array2 -array ("b" => "зеленый", "желтый", "красный");
$result = array_diff ($arrayl, $array2);
В результате выполнения этого фрагмента массив $ result будет содержать одно
значение —blue.
См. также описание функции array_intersect() (раздел 8.1.6).
8.1.4. Обработка внешней функцией: array_filter
примечание
На момент написания книги функция была реализована только в CVS-версии, ориентированной на разработчиков.
array array_filter (array Input [, mixed callback] )
Функция arr ay_fi1ter () возвращает массив, содержащий все элементы входного массива, обработанные в соответствии с логикой внешней функции callback
(передается по имени). Если исходный массив является ассоциативным, все ключи сохраняют свои значения:
function odd($var) {
return ($var % 2 == 1);
}
function even($var) {
return ($var X 2 == 0);
}
$arrayl = array ("a"=>l, "b"=>2, "c"=>3, "d"=>4. "e"=>5);
$array2 =array (6, 7, 8, 9, 10. 11, 12);
$odd_arr = array_filter($arrayl, "odd"); \
$even_arr = array_filter($array2, "even");
В результате в массиве нечетных чисел $odd_arr соберутся значения ("а"=>1,
"с"=>3, "е"=>5), а в массиве $even_arr соответственно -(б, 8, 10, 12).
8.1.5. Обращение ключей и значений массива: array_flip
array array_fl1p (array trans)
Функция array_flip(), можно сказать, «выворачивает» массив наизнанку — тo
есть ключи становятся значениями, а значения, наоборот, ключами — и возвращает такой «вывернутый» массив как результат своей работы. Имейте в виду, что эта
функция может работать только со стрбковыми и целочисленными значениями
исходного массива, а в случае обнаружения других типов данных она генерирует
сообщение об ошибке.
Если в исходном массиве некоторое значение присвоено нескольким элементам,
то в обращенном массиве будет использоваться только последняя пара и, соответственно, только последний ключ.
В случае ошибки array_fliр() возвращает false:
// обычное использование функции
$trans = array_tlip ($trans);
$original = strtr ($str, Strans);
//a в этом фрагменте происходит "столкновение интересов"
$trans = array ("a" => 1, "b" => 1. "с" => 2);
$trans = array_fl1p (Strans);
// в результате Strans равен : array(l => "b", 2 => "с");
8.1.6. Выделение пересечения: arrayjntersect
array array_intersect (array arrayl, array array2 [. array ...])
Функция array_intersect() возвращает массив, в котором содержатся все элементы аргумента array1, которые также присутствуют во всех прочих ее аргументах. При этом ключи исходного массива сохраняются:
$arrayl = array ("a" => "зеленый", "красный", "синий");
$array2 = array ("b" => "зеленый", "желтый", "красный");
$result = array_intersect ($arrayl, $array2);
Результирующий массив будет иметь значение ("а" => "зеленый", "красный");
Обратите также внимание на функцию array_diff () (раздел 8.1.3).
8.1.7. Извлечение ключей массива: array_keys
array array_keys (array input [, mixed search_value] )
Функция arr ay_keys () возвращает массив, в котором содержатся числовые и строковые ключи исходного массива.
В случае, если при вызове функции был указан дополнительный аргумент
search_value то в выходной массив будут помещены только те ключи, для которых элементы массива имеют указанное значение. Если же этот аргумент не используется, возвращаются все ключи входного массива.
Вот несколько примеров использования этой функции:
$array = array (0 => 100, "цвет" => "красный");
array_keys ($array);
// возвращаемый массив - (0, "цвет")
1
$array = array ("синий", "красный", "зеленый", "синий", "синий");
array_keys (Sarray, "синий");
// возвращаемый массив -(0,3,4)
$array = array ("цвет" => аrrау ("синий", "красный", "зеленый"),
"размер" => аrrау("маленький", "средний","большой"));
array_keys ($array);
// возвращаемый массив - ("цвет", "размер")
примечание
Имейте в виду, что приведенный выше синтаксис характерен только для РНР 4.
Программы на РНР 3, использующие эту функцию, вам придется переделывать...
8.1.8. Функционал отображения: array_map
array array_map (mixed callback, array arrl [, array arr2...] )
Функция array_map ( ) введена в PHP под несомненным влиянием Лиспа, из которого, откровенно говоря, народ не стесняясь тащит то одну, то другую идею. К сожалению, чтобы полностью оценить возможности этой функции, нужно иметь хотя бы небольшой опыт работы с Лиспом.
А говоря коротко, array_maр ) возвращает массив, в котором содержатся все элементы массива arrl после применения к каждому из них некоторого преобразования, реализуемого функцией callback. При этом количество аргументов, принимаемых функцией callback, должно совпадать с количеством массивов,
переданных функций arr_map ().
примечание
На момент написания книги функция была реализована только в CVS-версии,
ориентированной на разработчиков.
Вот простейший пример использования этой функции:
function cube($n) {
return $n*$n*$n;
}
$a = arrayd. 2, 3. 4. 5);
$b = array_map ('cube". $a);
В результате переменная $b будет содержать массив (1. 8, 27, 64, 125).
А теперь давайте попробуем поработать сразу с двумя массивами, создав тем самым небольшой русско-украинский разговорник:
<HTML>
<ТIТLЕ>Русско-украинский разговорник</ТIТLЕ>
<body bgcolor="#FFFFFF">
<?
function по_украински($n, $m) {
return "Число $n по-украински называется $m";
}
function отображение_по__украински{$n, $m) {
return array ($n => $m);
}
$a = arrayd. 2. 3. 4. 5);
// в русской транскрипции!
$b = аrrау ("одын", "два", "тры", "чотыры", "пьять");
$с = аrrау_mар("по_украински", $а, $b):
?>
<table border=1>
<tr><th>по_украински</th><th>отображение_по_украински</th></tr>
<tr><td>
<?
print_r($c):
?>
</td><td>
print_r($d);
?>
</td></tr>
</table>
8.1.9. Слияние массивов: array_merge
array array_merge (array arrayl, array array2 [, array ...J)
Функция arr ay_merge ( ) осуществляет слияние элементов двух массивов в один
таким образом, что элементы второго дописываются в конец предыдущего. После
этого функция возвращает результирующий массив.
Если некоторые из входных массивов имеют одинаковый строковые ключи элементов, то последующее значение элемента с таким ключом перекрывает предыдущее, которое безвозвратно теряется. Но если массивы индексируются целочисленными ключами, значение повторяющегося ключа не будет перекрывать
предыдущее, а будет дописано в конец массива с новым ключом:
$arrayl =5 array ("цвет" => "красный", 2, 4);
$array2 = array ("а", "b", "цвет" => "зеленый","форма" => "трапеция". 4);
array_merge ($arrayl, $array2);
В результате будет получен массив:
Array
("цвет" => "зеленый", 2, 4, "а", "b",
"форма" => "трапеция", 4)
8.1.10. Рекурсивное слияние массивов: array_merge_recursive
array array_merge_recurs1ve (array arrayl, array arrayl [, array ...])
Функция array_merge_recursi ve() осуществляет слияние элементов двух или
большего числа массивов таким образом, что значения последующего дописываются в конец предыдущего. После этого функция возвращает сформированный
таким образом массив как результат своей работы.
В случае если некоторые из входных массивов используют одни и те же строковые
ключи, значения этих ключей сливаются в отдельный массив. Эта операция повторяется рекурсивным образом на всю глубину вложенности исходных массивов. Но если массивы построены с использованием числовыхключей, слияние не
производится, а это значение просто дописывается в конец массива:
$arl = array ("цвет" => array ("favorite" => "красный"), 5);
$ar2 = array (10,
"цвет" => array ("favorite" => "зеленый", "синий"));
$result = array_merge_recurs1ve ($arl, $ar2);
В результате будет получен массив:
Array (
"цвет" => array
("favorite" => array
("красный", "зеленый"),
"синий"), 5, 10).
8.1.11. Заполнение массива: array_pad
array array_pad (array input, int pad_size, mixed pad_value)
Функция array_pad() возвращает копию входного массива, увеличенную (растянутую) до размера, определяемого аргументом pad_size. При этом добавленные элементы инициализируются значением pad^value. Если аргумент pad_size
больше нуля, массив .наращивается справа (с конца), а если этот аргумент отрицательный, дополнительные элементы вставляются в начало массива. И наконец, если
абсолютное значение pad_size меньше или равно текущей длине массива, операция просто не выполняется.
Вот несколько примеров использования этой функции:
$input = .array (12, 10, 9);
$result = array_pad ($input, 5, 0);
// результат - array (12. 10, 9, 0, 0)
$result = array_pad ($input, -7, -1);
// результат - array (-1. -1. -1, -1. 12. 10, 9)
$result = array_pad ($input, 2, "noop");
// ничего не происходит
8.1.12. Выталкивание элемента: array_pop
mixed array_pop (array array)
Функция arr ay_pop ( ) выталкивает из массива и возвращает последнее хранящееся в нем значение, укорачивая при этом массив на один элемент. Если массив
пуст (или просто аргумент функции не является массивом), функция возвращает
NULL:
$stack = array ("банан", "яблоко", "груша");
$fruit = array_pop ($stack);
После выполнения этого фрагмента в массиве $stack останется только два элемента — «яблоко» и «банан», а переменная $fruit получит значение «груша».
Операции со стекоподобными структурами выполняются также функциями
array_push() (раздел 8.1.13),array_shift () (раздел 8.1.17),a тaкже array_unsh1ft()
(раздел 8.1.22).
8.1.13. Заталкивание в массив: array_push
int array_push (array array, mixed var [, mixed ...] )
Функция аrr ay_push () рассматривает массив array как стек, и проталкивает в него
второй и последующие аргументы, помещая их в конец массива. При этом длина
массива увеличивается на количество погруженных в него элементов. По большому счету, эта функция эквивалентна конструкции:
$array[] = $var;
которая повторяется для каждого вталкиваемого в массив значения. По завершении функция возвращает новое количество элементов массива:
$stack = array (1,2);
array_push ($stack, "+", 3);
В результате выполнения этого фрагмента массив $stасk будет содержать четыре
элемента: 1,2,«+» и 3.
8.1.14. Случайная выборка элементов: array_rand
mixed array_rand (array input [, int num_req])
Функция array_rand ( ) полезна в тех случаях, когда вам необходимо случайным
образом выбрать из массива одну или несколько записей. Функция принимает в
качестве аргумента массив Input и необязательное число num_req, указывающее,
сколько элементов вы хотите извлечь. По умолчанию выбирается один элемент.
примечание
Надеюсь, практическое применение этой функции вполне очевидно — легкая и непринужденная генерация баннеров на своей страничке.
Если вы выбираете из массива только одну запись, array_rand() возвращает ключ
этой записи. В противном случае функция возвращает массив ключей случайным
образом выбранных записей.
совет
Не забудьте предварительно вызвать функцию srand( ) для установки начального значения генератора случайных чисел.
В приведенном ниже фрагменте производится выборка двух случайных значений
из массива $ input. Функция возвращает массив с двумя ключами, которые затем
используются для извлечения данных из исходного массива:
srand ((double) microtime( ) * 100000000);
$input = array ("Neo", "Morpheus", "Trinity", "Cypher", "Tank"):
$rand_keys = array rand (Sinput, 2);
print $input $rand_keys[0]]."\n";
print $input[$rand_keys[1]]."\n";
|