Массивы в PHP

Массивы

Способы создания массива:

  • С помощью конструкции 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>";
}
?>

Комментариев: 7

  • 16.09.2010 Михаил:

    Спасибо, очень познавательно

  • 23.11.2011 Алекс:

    Вообще не полезная статья!Перепечатываешь в PHP Designer 7 ошибки везде...

    Скажи как с простого Массива двумереного (числа) вывод сделать только чисел...есть какая нибудь функция...

    Проклинаю это Язык...Методички дурацкие...терпения нет...на *** пошел Я пошел учиться на программиста...

    • 23.11.2011 Кирилл:

      Алекс, может в цикле проверить элементы массива функцией is_numeric, если true, то делать echo.

      Да уж программистом становится и быть туго, понимаешь, что кругом беспросветная глупость и отсутствие смысла :D

  • 06.02.2012 Владикс:

    Спасибо за материал. Нашел решения своих дач по массивам.

  • 17.02.2012 Павел:

    Что-то я не возьму в толк, подскажите, пожалуйста, при создании массивов, под каким-то именем в Блокноте надо сохранять код PHP, или как?

    • 18.02.2012 Кирилл:

      Можно сохранять под именем arrays.php Вызывать так localhost/arrays.php если у вас на локальной машине установлена сборка web-сервера типа appserv/denver/xampp/the_uniform_server и файлик закинут в корень папки www.

  • 11.03.2012 Ветряный:

    Блин, а как по рег. выражению отобрать часть ключей примера нету(((


Добавление комментария:

 css.php