Массивы
Способы создания массива:
- С помощью конструкции array
$array_name = array("key1"=>"value1", "key2"=>"value2");
- Непосредственно задавая значения элементам массива
$array_name["key1"] = value1;
Пример
Создание массива хранящего список документов, где ключом является является идентификатор
документа, а значением – название документа.
<?php $del_items = array("10"=>"Наука и жизнь", "12"=>"Информатика"); $del_items["13"] = "Программирование на PHP"; // добавляем элемент в массив ?> |
Операции с массивами
Если складываются массивы в языке PHP, от перемены мест слагаемых сумма меняется.
<?php $a = array("и"=>"Информатика", "м"=>"Математика"); $b = array("и"=>"История","м"=>"Биология", "ф"=>"Физика"); $c = $a + $b; $d = $b +$a; print_r($c); /* Array([и]=>Информатика [м]=>Математика [ф]=>Физика) */ print_r($d); /* Array([и]=>История [м]=>Биология [ф]=>Физика) */ ?> |
Равенство массивов (обозначается символом «==») – совпадают все пары ключ/значение
элементов массивов. Эквивалентность (обозначается символом «===») – кроме равенства значений и
ключей элементов элементы в обоих массивах были записаны в одном и том же порядке.
<?php $a = array("и"=>"Информатика", "м"=>"Математика"); $b = array("м"=>"Математика", "и"=>"Информатика"); if ($a == $b) echo "Массивы равны и"; else echo "Массивы НЕ равны и "; if ($a === $b) echo " эквивалентны"; else echo " НЕ эквивалентны"; // "Массивы равны и НЕ эквивалентны" ?> |
Функция count
Применяя эту функцию к многомерному массиву, чтобы получить число его элементов, нужно использовать
дополнительный параметр COUNT_RECURSIVE.
<?php $del_items = array("langs" => array("10"=>"Python", "12"=>"Lisp"), "other"=>"Информатика"); echo count($del_items) . "<br>"; // выведет 2 echo count($del_items,COUNT_RECURSIVE); // выведет 4 ?> |
Функция in_array
Позволяет установить, содержится ли в заданном массиве искомое значение.
in_array("искомое значение","массив", ["ограничение на тип"]); |
Ищем язык PHP среди изученных.
<?php $langs = array("Lisp","Python","Java","PHP","Perl"); if (in_array("PHP",$langs,true)) echo "Надо бы изучить PHP<br>"; // выведет сообщение "Надо бы изучить PHP" if (in_array("php",$langs)) echo "Надо бы изучить php<br>"; // ничего не выведет, поскольку в массиве // есть строка "PHP", а не "php" ?> |
Можно искать и массив:
<?php $langs = array("Lisp","Python",array("PHP","Java"),"Perl"); if (in_array(array("PHP","Java"),$langs)) echo "Надо бы изучить PHP и Java<br>"; ?> |
Функция array_search
В отличие от in_array в результате работы array_search возвращает значение ключа, если элемент найден,
и ложь – в противном случае. Синтаксис одинаковый.
<?php $langs = array("Lisp","Python","Java","PHP","Perl"); if (!array_search("PHP",$langs)) echo "Надо бы изучить PHP<br>"; else { $k = array_search("PHP",$langs); echo "PHP я изучила $k – м"; // PHP я изучила 3 – м } ?> |
Функция array_keys
Функция array_keys() выбирает все ключи массива.
array_keys ("массив", ["значение для поиска"])
Проверяем на дублированные записи языка Lisp в массиве.
<?php $langs = array("Lisp","Python","Java","PHP","Perl","Lisp"); $lisp_keys = array_keys($langs,"Lisp"); echo "Lisp входит в массив ". count($lisp_keys) ." раза:<br>"; foreach ($lisp_keys as $val){ echo "под номером $val <br>"; // Lisp входит в массив 2 раза: // под номером 0 // под номером 5 } ?> |
Функция array_unique
Функция array_unique(массив) возвращает новый массив в котором повторяющиеся элементы
фигурируют в одном экземпляре.
<?php $langs = array("Lisp","Java","Python","Java","PHP","Perl","Lisp"); print_r(array_unique($langs)); // Array ([0]=>Lisp [1]=>Java [2]=>Python [3]=>PHP [4]=>Perl) ?> |
Сортировка массивов
Функция sort
sort (массив [, флаги])
Эта функция сортирует значения массива по возрастанию и удаляет все существовавшие в массиве ключи, заменяя их числовыми индексами,
соответствующими новому порядку элементов.
Пусть у нас есть два массива: цены товаров – их названия и, наоборот, названия товаров – их цены.
Упорядочим эти массивы по возрастанию:
<?php $items = array(10 => "хлеб", 20 => "молоко", 30 => "бутерброд"); sort($items); // строки сортируются в алфавитном порядке, ключи теряются print_r($items); // Array ([0]=>бутерброд [1]=>молоко [2]=>хлеб ) $rev_items = array("хлеб" => 10, "бутерброд" => 30, "молоко" => 20); sort($rev_items); // числа сортируются по возрастанию, ключи теряются print_r($rev_items); // Array ([0]=>10 [1]=>20 [2]=>30) ?> |
В качестве дополнительного аргумента флаги может использоваться одна из следующих констант:
- SORT_REGULAR – сравнивать элементы массива обычным образом;
- SORT_NUMERIC – сравнивать элементы массива как числа;
- SORT_STRING – сравнивать элементы массива как строки.
Функции asort, rsort, arsort
- asort (массив [, флаги]) — сохраняет индексы элементов массива после сортировки.
- rsort (массив [, флаги]) — сортирует массив в обратном порядке.
- arsort(массив [, флаги]) — asort+rsort.
<?php $books = array("Пушкин"=>"Руслан и Людмила","Толстой"=>"Война и мир","Лермонтов"=>"Герой нашего времени"); asort($books); // сортируем массив, сохраняя значения ключей print_r($books); // Array ([Толстой]=>Война и мир [Лермонтов]=>Герой нашего времени [Пушкин]=>Руслан и Людмила ) echo "<br>"; rsort($books); // сортируем массив в обратном порядке, ключи будут заменены print_r($books); // Array ([0]=>Руслан и Людмила [1]=>Герой нашего времени [2]=>Война и мир) ?> |
Форма для создания каталога описаний документов
<form action=task.php> <table border=1> <tr> <td>Название</td> <td><input type=text name=title size=5> </td> </tr> <tr> <td>Краткое содержание </td><td><input type=text name=description size=5> </td> </tr> <tr> <td>Автор </td><td><input type=text name=author size=5> </td> </tr> <tr> <td>Дата публикации </td><td><input type=text name=published size=5> </td> </tr> </table> <input type=submit value="Отправить"> </form> |
Упорядочим данные, переданные этой формой, по убыванию их значений, сохраняя при этом значения ключей.
<?php print_r($_GET); echo "<br>"; arsort ($_GET); // сортируем массив в обратном порядке, // сохраняя ключи print_r($_GET); echo "<br>"; $ordered_names = array_keys($_GET); // составляем новый массив foreach($ordered_names as $key => $val) echo "$key :$val <br>"; // выводим элементы нового массива ?> |
Сортировка массива по ключам
<?php $books = array("Пушкин"=>"Руслан и Людмила", "Толстой"=>"Война и мир", "Лермонтов"=>"Герой нашего времени"); ksort($books); // сортируем массив, // сохраняя значения ключей print_r($books); // Array ([Лермонтов]=>Герой нашего времени [Пушкин]=>Руслан и Людмила [Толстой]=>Война и мир) ?> |
Сортировка с помощью функции, заданной пользователем
usort (массив , сортирующая функция)
uksort (массив , сортирующая функция)
Сортирующая функция должна иметь два аргумента, в них интерпретатор будет передавать пары значений
элементов для функции usort() или ключей массива для функции uksort().
Во-вторых, сортирующая функция должна возвращать:
- целое число, меньшее нуля, если первый аргумент меньше второго;
- число, равное нулю, если два аргумента равны;
- число большее нуля, если первый аргумент больше второго.
Как и для других функций сортировки, для функции usort() существует аналог, не изменяющий значения ключей,
– функция uasort().
<?php // массив выглядит таким образом: $books = array("Герой нашего времени" => array ("Лермонтов", 1840), "Руслан и Людмила" => array("Пушкин",1820), "Война и мир" => array ("Толстой",1863), "Идиот" => array("Достоевский",1868)); /* можно, конечно переписать этот массив по-другому, сделав год издания, например, индексом, но гораздо удобнее написать свою функцию для сортировки */ uasort($books,"cmp"); // сортируем массив с помощью функции cmp foreach ($books as $key => $book) {echo "$book[0]: \"$key\"<br>";} 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() считается неопределенным.
<?php $books1 = array("А.С. Пушкин"=>"Руслан и Людмила", "Л.Н. Толстой"=>"Война и мир", "М.Ю. Лермонтов"=>"Герой нашего времени"); // создаем функцию, которую хотим // применить к элементам массива function try_walk($val,$key,$data){ echo "$data \"$val\" написал $key<br>"; } // применяем ко всем элементам массива // $books1 функцию try_walk array_walk($books1,"try_walk","Роман"); // Роман "Руслан и Людмила" написал А.С. Пушкин // Роман "Война и мир" написал Л.Н. Толстой // Роман "Герой нашего времени" написал М.Ю. Лермонтов ?> |
Заметим, что мы не изменили значений у элементов массива. Чтобы их изменить, надо было передавать значения в переменную $val функции try_walk по ссылке.
<?php $books1 = array("А.С. Пушкин"=>"Руслан и Людмила", "Л.Н. Толстой"=>"Война и мир", "М.Ю. Лермонтов"=>"Герой нашего времени"); // создаем функцию, которую хотим // применить к элементам массива function try_walk(&$val,$key){ $key = "<p>Автор: " .$key ."<br>"; $val = "Название: \"" . $val ."\"</p>"; echo $key.$val; } // применяем ко всем элементам массива // $book1 функцию try_walk array_walk($books1,"try_walk"); print_r($books1); // Автор: А.С. Пушкин // Название: "Руслан и Людмила" // Автор: Л.Н. Толстой // Название: "Война и мир" // Автор: М.Ю. Лермонтов // Название: "Герой нашего времени" // Array ( [А.С. Пушкин]=>Название: "Руслан и Людмила" [Л.Н. Толстой]=>Название: "Война и мир" [М.Ю. Лермонтов]=>Название: "Герой нашего времени") ?> |
Выделение подмассива
Функция array_slice
Функция array_slice (массив, номер_элемента [, длина]) выделяет подмассив длины длина в массиве массив,
начиная с элемента, номер которого задан параметром номер_элемента. Положительный номер_элемента указывает
на порядковый номер элемента относительно начала массива, отрицательный – на номер элемента с конца массива.
<?php $arr = array(1,2,3,4,5); $sub_arr = array_slice($arr,2); print_r($sub_arr); // выведет Array ([0]=>3 [1]=>4 [2]=>5 ), т.е. подмассив, состоящий из элементов 3, 4, 5 $sub_arr = array_slice($arr,-2); print_r($sub_arr); // выведет Array ( [0] => 4 [1] => 5 ), т.е. подмассив, из элементов 4, 5 ?> |
Если задать параметр длина при использовании array_slice, то будет выделен подмассив,
имеющий ровно столько элементов, сколько задано этим параметром. Длину можно указывать и отрицательную.
В этом случае интерпретатор удалит с конца массива число элементов, равное модулю параметра длина.
<?php $arr = array(1,2,3,4,5); $sub_arr = array_slice($arr, 2, 2); // содержит массив из элементов 3, 4 $sub = array_slice($arr,-3, 2); // тоже содержит массив из элементов 3, 4 $sub1 = array_slice($arr,0, -1); // содержит массив из элементов 1, 2, 3, 4 $sub2 = array_slice($arr,-4, -2); // содержит массив из элементов 2, 3 ?> |
Функция array_chunk
Разбивает массив на несколько подмассивов заданной длины,
array_chunk ( массив, размер [, сохранять_ключи]),
возвращает многомерный массив, элементы которого представляют собой полученные подмассивы.
Есть список приглашенных, оформленный в виде массива их фамилий, имеются столики на три персоны,
нужно распределить всех приглашенных по трое.
<?php $persons = array("Иванов", "Петров", "Сидорова","Зайцева", "Волкова"); $triples = array_chunk($persons,3); // делим массив на подмассивы по три элемента foreach ($triples as $k => $table){ // выводим полученные тройки echo "За столиком номер $k сидят: <ul>"; foreach ($table as $pers) echo "<li>$pers"; echo "</ul>"; } /* за столиком номер 0 сидят: • Иванов • Петров • Сидорова за столиком номер 1 сидят: • Зайцева • Волкова */ ?> |
Сумма элементов массива
Дан массив натуральных чисел. Найти в нем такое число,
сумма элементов справа от которого равна сумме элементов слева от него.
<?php //массив задается функцией array $arr = array(2,1,3,4,5,6,4); // перебираем каждый элемент массива $arr. Внутри цикла текущий ключ массива // содержится в переменной $k, текущее значение – в переменной $val foreach ($arr as $k => $val){ $p = $k + 1; // синтаксис array array_slice ( array array,int offset [,int length]) // array_slice выделяет подмассив длины length в массиве array, начиная с элемента offset. $out_next = array_slice($arr,$p); // получаем массив элементов, идущих после текущего $out_prev = array_slice($arr,0,$k); // получаем массив элементов, идущих перед текущим // функция mixed array_sum (array array) подсчитывает сумму элементов массива array $next_sum = array_sum($out_next); $prev_sum = array_sum($out_prev); // если сумма элементов до текущего равна сумме элементов после, то выводим // значение текущего элемента if ($next_sum==$prev_sum) echo "value:$val"; // можно посмотреть, что представляют собой рассмотренные массивы на каждом шаге // print_r($out_next); echo "<br>"; // print_r($out_prev); // echo "$next_sum, $prev_sum<br>"; echo "<hr>"; } ?> |
Спасибо, очень познавательно
Вообще не полезная статья!Перепечатываешь в PHP Designer 7 ошибки везде...
Скажи как с простого Массива двумереного (числа) вывод сделать только чисел...есть какая нибудь функция...
Проклинаю это Язык...Методички дурацкие...терпения нет...на *** пошел Я пошел учиться на программиста...
Алекс, может в цикле проверить элементы массива функцией is_numeric, если true, то делать echo.
Да уж программистом становится и быть туго, понимаешь, что кругом беспросветная глупость и отсутствие смысла
Спасибо за материал. Нашел решения своих дач по массивам.
Что-то я не возьму в толк, подскажите, пожалуйста, при создании массивов, под каким-то именем в Блокноте надо сохранять код PHP, или как?
Можно сохранять под именем arrays.php Вызывать так localhost/arrays.php если у вас на локальной машине установлена сборка web-сервера типа appserv/denver/xampp/the_uniform_server и файлик закинут в корень папки www.
Блин, а как по рег. выражению отобрать часть ключей примера нету(((