Відмінності між версіями «Робота з асоціативними масивами в PHP»

Матеріал з Вікі ЦДУ
Перейти до: навігація, пошук
Рядок 475: Рядок 475:
 
Вам подобається жовтий? </pre>
 
Вам подобається жовтий? </pre>
 
<p><ins>Наступний приклад:</ins></p>
 
<p><ins>Наступний приклад:</ins></p>
  code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 187);">&lt;?php<br>
+
  <code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 187);">&lt;?php<br>
 
   $firstquarter  </span><span style="color: rgb(0, 119, 0);">= array(</span><span style="color: rgb(0, 0, 187);">1 </span><span style="color: rgb(0, 119, 0);">=&gt; </span><span style="color: rgb(221, 0, 0);">'Январь'</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(221, 0, 0);">'Февраль'</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(221, 0, 0);">'Март'</span><span style="color: rgb(0, 119, 0);">);<br>
 
   $firstquarter  </span><span style="color: rgb(0, 119, 0);">= array(</span><span style="color: rgb(0, 0, 187);">1 </span><span style="color: rgb(0, 119, 0);">=&gt; </span><span style="color: rgb(221, 0, 0);">'Январь'</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(221, 0, 0);">'Февраль'</span><span style="color: rgb(0, 119, 0);">, </span><span style="color: rgb(221, 0, 0);">'Март'</span><span style="color: rgb(0, 119, 0);">);<br>
 
   </span><span style="color: rgb(0, 0, 187);">print_r</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$firstquarter</span><span style="color: rgb(0, 119, 0);">);<br>
 
   </span><span style="color: rgb(0, 0, 187);">print_r</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$firstquarter</span><span style="color: rgb(0, 119, 0);">);<br>
Рядок 497: Рядок 497:
 
  </span><span style="color: rgb(255, 128, 0);">// заполняет массив всеми элементами директории<br>
 
  </span><span style="color: rgb(255, 128, 0);">// заполняет массив всеми элементами директории<br>
 
  </span><span style="color: rgb(0, 0, 187);">$handle </span><span style="color: rgb(0, 119, 0);">= </span><span style="color: rgb(0, 0, 187);">opendir</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(221, 0, 0);">'.'</span><span style="color: rgb(0, 119, 0);">);<br>
 
  </span><span style="color: rgb(0, 0, 187);">$handle </span><span style="color: rgb(0, 119, 0);">= </span><span style="color: rgb(0, 0, 187);">opendir</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(221, 0, 0);">'.'</span><span style="color: rgb(0, 119, 0);">);<br>
while (</span><span style="color: rgb(0, 0, 187);">false </span><span style="color: rgb(0, 119, 0);">!== (</span><span style="color: rgb(0, 0, 187);">$file </span><span style="color: rgb(0, 119, 0);">= </span><span style="color: rgb(0, 0, 187);">readdir</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$handle</span><span style="color: rgb(0, 119, 0);">))) {<br>
+
while (</span><span style="color: rgb(0, 0, 187);">false </span><span style="color: rgb(0, 119, 0);">!== (</span><span style="color: rgb(0, 0, 187);">$file </span><span style="color: rgb(0, 119, 0);">= </span><span style="color: rgb(0, 0, 187);">readdir</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$handle</span><span style="color: rgb(0, 119, 0);">))) {<br>
 
  </span><span style="color: rgb(0, 0, 187);">$files</span><span style="color: rgb(0, 119, 0);">[] = </span><span style="color: rgb(0, 0, 187);">$file</span><span style="color: rgb(0, 119, 0);">;<br>
 
  </span><span style="color: rgb(0, 0, 187);">$files</span><span style="color: rgb(0, 119, 0);">[] = </span><span style="color: rgb(0, 0, 187);">$file</span><span style="color: rgb(0, 119, 0);">;<br>
}<br>
+
}<br>
 
  </span><span style="color: rgb(0, 0, 187);">closedir</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$handle</span><span style="color: rgb(0, 119, 0);">);<br>
 
  </span><span style="color: rgb(0, 0, 187);">closedir</span><span style="color: rgb(0, 119, 0);">(</span><span style="color: rgb(0, 0, 187);">$handle</span><span style="color: rgb(0, 119, 0);">);<br>
 
  </span><span style="color: rgb(0, 0, 187);">?&gt;</span> </span></code>
 
  </span><span style="color: rgb(0, 0, 187);">?&gt;</span> </span></code>
  
<p>Упорядкування масивів. Ви можете змінювати порядок елементів, використовуючи різні функції сортування. Для додаткової інформації дивіться розділ <a href="/learnphp/datatypes/?array3" target="_blank">функції для роботи з масивами</a>. Ви можете підрахувати кількість елементів у масиві, використовуючи функцію <a href="/functions/?count" target="_blank"><b class="function">count()</b></a>.</p>
+
<p>Упорядкування масивів. Ви можете змінювати порядок елементів, використовуючи різні функції сортування. Для додаткової інформації дивіться розділ функції для роботи з масивами. Ви можете підрахувати кількість елементів у масиві, використовуючи функцію <b>count()</b></.</p>
<p>Рекурсивні та багатовимірні масиви:</p>
+
<p><ins>Рекурсивні та багатовимірні масиви:</ins></p>
 
  <code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 187);">&lt;?php<br>
 
  <code><span style="color: rgb(0, 0, 0);"><span style="color: rgb(0, 0, 187);">&lt;?php<br>
 
   $fruits </span><span style="color: rgb(0, 119, 0);">= array ( </span><span style="color: rgb(221, 0, 0);">"фрукты" </span><span style="color: rgb(0, 119, 0);">=&gt; array ( </span><span style="color: rgb(221, 0, 0);">"a" </span><span style="color: rgb(0, 119, 0);">=&gt; </span><span style="color: rgb(221, 0, 0);">"апельсин"</span><span style="color: rgb(0, 119, 0);">,<br>                                     
 
   $fruits </span><span style="color: rgb(0, 119, 0);">= array ( </span><span style="color: rgb(221, 0, 0);">"фрукты" </span><span style="color: rgb(0, 119, 0);">=&gt; array ( </span><span style="color: rgb(221, 0, 0);">"a" </span><span style="color: rgb(0, 119, 0);">=&gt; </span><span style="color: rgb(221, 0, 0);">"апельсин"</span><span style="color: rgb(0, 119, 0);">,<br>                                     
Рядок 510: Рядок 510:
 
   </span><span style="color: rgb(221, 0, 0);">"c" </span><span style="color: rgb(0, 119, 0);">=&gt; </span><span style="color: rgb(221, 0, 0);">"яблоко"<br>                                       
 
   </span><span style="color: rgb(221, 0, 0);">"c" </span><span style="color: rgb(0, 119, 0);">=&gt; </span><span style="color: rgb(221, 0, 0);">"яблоко"<br>                                       
 
   </span><span style="color: rgb(0, 119, 0);">),<br>                     
 
   </span><span style="color: rgb(0, 119, 0);">),<br>                     
   </span><span style="color: rgb(221, 0, 0);">"числа"  </span><span style="color: rgb(0, 119, 0);">=&gt; array ( </span><span style="color: rgb(0, 0, 187);">1</span><span style="color: rgb(0, 119, 0);">,<br>                                        
+
   </span><span style="color: rgb(221, 0, 0);">"числа"  </span><span style="color: rgb(0, 119, 0);">=&gt; array ( </span><span style="color: rgb(0, 0, 187);">1</span><span style="color: rgb(0, 119, 0);">,                                         
   </span><span style="color: rgb(0, 0, 187);">2</span><span style="color: rgb(0, 119, 0);">,<br>                                       
+
   </span><span style="color: rgb(0, 0, 187);">2</span><span style="color: rgb(0, 119, 0);">,                                      
   </span><span style="color: rgb(0, 0, 187);">3</span><span style="color: rgb(0, 119, 0);">,<br>                                        
+
   </span><span style="color: rgb(0, 0, 187);">3</span><span style="color: rgb(0, 119, 0);">,                                         
   </span><span style="color: rgb(0, 0, 187);">4</span><span style="color: rgb(0, 119, 0);">,<br>                                        
+
   </span><span style="color: rgb(0, 0, 187);">4</span><span style="color: rgb(0, 119, 0);">,                                         
   </span><span style="color: rgb(0, 0, 187);">5</span><span style="color: rgb(0, 119, 0);">,<br>                                        
+
   </span><span style="color: rgb(0, 0, 187);">5</span><span style="color: rgb(0, 119, 0);">,                                         
 
   </span><span style="color: rgb(0, 0, 187);">6<br>                                       
 
   </span><span style="color: rgb(0, 0, 187);">6<br>                                       
 
   </span><span style="color: rgb(0, 119, 0);">),<br>                     
 
   </span><span style="color: rgb(0, 119, 0);">),<br>                     
Рядок 526: Рядок 526:
 
   </span><span style="color: rgb(0, 119, 0);">echo </span><span style="color: rgb(0, 0, 187);">$fruits</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(221, 0, 0);">"фрукты"</span><span style="color: rgb(0, 119, 0);">][</span><span style="color: rgb(221, 0, 0);">"a"</span><span style="color: rgb(0, 119, 0);">]; </span><span style="color: rgb(255, 128, 0);">// напечатает "апельсин"<br>
 
   </span><span style="color: rgb(0, 119, 0);">echo </span><span style="color: rgb(0, 0, 187);">$fruits</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(221, 0, 0);">"фрукты"</span><span style="color: rgb(0, 119, 0);">][</span><span style="color: rgb(221, 0, 0);">"a"</span><span style="color: rgb(0, 119, 0);">]; </span><span style="color: rgb(255, 128, 0);">// напечатает "апельсин"<br>
 
   </span><span style="color: rgb(0, 119, 0);">unset(</span><span style="color: rgb(0, 0, 187);">$fruits</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(221, 0, 0);">"дырки"</span><span style="color: rgb(0, 119, 0);">][</span><span style="color: rgb(0, 0, 187);">0</span><span style="color: rgb(0, 119, 0);">]);  </span><span style="color: rgb(255, 128, 0);">// удалит "первая"<br>
 
   </span><span style="color: rgb(0, 119, 0);">unset(</span><span style="color: rgb(0, 0, 187);">$fruits</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(221, 0, 0);">"дырки"</span><span style="color: rgb(0, 119, 0);">][</span><span style="color: rgb(0, 0, 187);">0</span><span style="color: rgb(0, 119, 0);">]);  </span><span style="color: rgb(255, 128, 0);">// удалит "первая"<br>
 
 
   // Создаст новый многомерный массив<br>
 
   // Создаст новый многомерный массив<br>
 
   </span><span style="color: rgb(0, 0, 187);">$juices</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(221, 0, 0);">"яблоко"</span><span style="color: rgb(0, 119, 0);">][</span><span style="color: rgb(221, 0, 0);">"зеленое"</span><span style="color: rgb(0, 119, 0);">] = </span><span style="color: rgb(221, 0, 0);">"хорошее"</span><span style="color: rgb(0, 119, 0);">;<br>
 
   </span><span style="color: rgb(0, 0, 187);">$juices</span><span style="color: rgb(0, 119, 0);">[</span><span style="color: rgb(221, 0, 0);">"яблоко"</span><span style="color: rgb(0, 119, 0);">][</span><span style="color: rgb(221, 0, 0);">"зеленое"</span><span style="color: rgb(0, 119, 0);">] = </span><span style="color: rgb(221, 0, 0);">"хорошее"</span><span style="color: rgb(0, 119, 0);">;<br>

Версія за 11:22, 21 квітня 2010

Асоціативні масиви в PHP

В У PHP індексом масиву може бути не тільки число, а й рядок. Причому на такий рядок не накладаються ніякі обмежень: він може містити пробіли, довжина такого рядка може бути будь-яка.

Асоціативні масиви особливо зручні в ситуаціях, коли елементи масиву зручніше пов'язувати зі словами, а не з числами.

Отже, масиви, індексами яких є рядки, називаються асоціативними масивами.</ins>.

Одновимірні асоціативні масиви::

Одновимірні асоціативні масиви містять тільки один ключ (елемент), відповідний конкретному індексу асоціативного масиву. Наведемо приклад:

<?php
// Ассоциативный массив
$names["Иванов"]="Иван";
$names["Сидоров"]="Николай";
$names["Петров"]="Петр";
// В данном примере: фамилии - ключи ассоциативного массива
// , а имена - элементы массива names
?>

Доступ до елементів одновимірних асоціативних масивів здійснюється так само, як і до елементів звичайних масивів, і має назвудоступом по ключу:

echo $names["Иванов"];

Багатовимірні асоціативні масиви:

Багатовимірні асоціативні масиви можуть містити кілька ключів, відповідних конкретному індексу асоціативного масиву. Розглянемо приклад багатовимірного асоціативного масиву:

<?php
// Многомерный массив
$A["Ivanov"] = array("name"=>"Иванов И.И.", "age"=>"25", "email"=>"[email protected]");
$A["Petrov"] = array("name"=>"Петров П.П.", "age"=>"34", "email"=>"[email protected]");
$A["Sidorov"] = array("name"=>"Сидоров С.С.", "age"=>"47", "email"=>"[email protected]");
?>

Багатовимірні масиви схожі на записи в мові Pascal або структури в мові C.

Доступ до елементів багатовимірного асоціативного масиву здійснюється таким чином:

echo $A["Ivanov"]["name"]; // Выводит Иванов И.И.
echo $A["Petrov"]["email"]; // Выводит [email protected]

Як ви вже помітили, для створення багатовимірного асоціативного масиву ми використовували спеціальну функцію array, ми її розглянемо пізніше, коли будемо розглядати операції над масивами.

Асоціативні багатовимірні масиви можна створювати і класичним способом, хоча це не так зручно:

<?php
// Многомерный ассоциативный массив
$A["Ivanov"]["name"]="Иванов И.И.";
$A["Ivanov"]["age"]="25";
$A["Ivanov"]["email"]="[email protected]";
$A["Petrov"]["name"]="Петров П.П.";
$A["Petrov"]["age"]="34";
$A["Petrov"]["email"]="[email protected]";
$A["Sidorov"]["name"]="Сидоров С.С.";
$A["Sidorov"]["age"]="47";
$A["Sidorov"]["email"]="[email protected]";
// Получаем доступ к ключам многомерного ассоциативного массива
echo $A["Ivanov"]["name"]."<br>"; // Выводит Иванов И.И.
echo $A["Sidorov"]["age"]."<br>"; // Выводит 47
echo $A["Petrov"]["email"]."<br>"; // Выводит [email protected]
?>

Фукціі для роботи з масивами і операції над масивами

Функції для роботи з масивами

Розглянемо деякі основні функції для роботи з масивами.

Функція list()

Припустимо, у нас є масив, що складається з трьох елементів:

$names[0]="Александр";
$names[1]="Николай";
$names[2]="Яков";

Припустимо, в якийсь момент нам потрібно передати значення всіх трьох елементів масиву, відповідно трьом змінним: $alex, $nick, $yakov. Это можно сделать так:

$alex = $names[0];
$nick = $names[1];
$yakov = $names[2];

Якщо масив великий, то такий спосіб привласнення елементів масиву змінним не дуже зручний.

Є більш раціональний підхід - використання функції.:

list ($alex, $nick, $yakov) = $names;

Якщо нам потрібні тільки "Николай" и "Яков", тоді ми можемо зробити так:

list (, $nick, $yakov) = $names;

Функція array()

Функція використовується спеціально для створення масивів. При цьому вона дозволяє створювати порожні масиви. Методи використання функції Array():

<?php
// Создает пустой массив:
$arr = array();
// Создает список с тремя элементами. Индексы начинаются с нуля:
$arr2 = array("Иванов","Петров","Сидоров");
// Создает ассоциативный массив с тремя элементами:
$arr3 = array("Иванов"=>"Иван", "Петров"=>"Петр", "Сидоров"=>"Сидор");
// Создает многомерный ассоциативный массив:
$arr4 = array("name"=>"Иванов", "age"=>"24", "email"=>"[email protected]");
$arr4 = array("name"=>"Петров", "age"=>"34", "email"=>"[email protected]");
$arr4 = array("name"=>"Сидоров", "age"=>"47", "email"=>"[email protected]");
?>

Операції над масивами

Сортування масивів

Почнемо з найпростішого - сортування масивів. У PHP для цього існує дуже багато функцій. З їх допомогою можна сортувати асоціативні масиви і списки в порядку зростання або убування, а також у тому порядку, в якому вам необхідно - за допомогою користувацької функції сортування.

Сортування масиву за значеннями за допомогою функцій asort() і arsort():

Функція asort() сортує масив, вказаний в її параметрі, так, щоб його значення йшли в алфавітному (якщо це рядки) або у зростаючому (для чисел) порядку.
При цьому зберігаються зв'язки між ключами та відповідними їм значеннями, тобто деякі пари ключ=>значення просто "спливають" вгору, а деякі - навпаки, "опускаються". Наприклад:

$A=array("a"=>"Zero","b"=>"Weapon","c"=>"Alpha","d"=>"Processor");
asort($A);
foreach($A as $k=>$v) echo "$k=>$v ";
// выводит "c=>Alpha d=>Processor b=>Weapon a=>Zero"
// как видим, поменялся только порядок пар ключ=>значение

Функція arsort() виконує те ж саме, за одним винятком: вона впорядковує масив не за зростанням, а за спаданням.

Сортування по ключам за допомогою функцій ksort() и krsort():

Функція ksort()практично ідентична функції asort(), з тїєю відмінністю, що сортування здійснюється не за значеннями, а за ключами (у порядку зростання).
Наприклад:

$A=array("d"=>"Zero", "c"=>"Weapon", "b"=>"Alpha", "a"=>"Processor");
ksort($A);
for(Reset($A); list($k,$v)=each($A);) echo "$k=>$v ";
// выводит "a=>Processor b=>Alpha c=>Weapon d=>Zero"

Функція для сортування за ключам у зворотному порядку називається krsort() і застосовується точно в такому ж контексті, що і ksort().

Сортування по ключам за допомогою функції uksort():

Досить часто нам доводиться сортувати щось за більш складного критерію, ніж просто за алфавітом. Наприклад, нехай у $Files зберігається список імен файлів і підкаталогів в поточному каталозі. Можливо, ми захочемо вивести цей список не тільки в лексикографічному порядку, але також і щоб всі каталоги передували файлів. У цьому випадку нам варто скористатися функцією uksort(), написавши попередньо функцію порівняння з двома параметрами, як того вимагає uksort().

<?php
// Эта функция должна сравнивать значения $f1 и $f2 и nbsp;возвращать:
// -1, если $f1<$f2,
// 0, если $f1==$f2
// 1, если $f1>$f2
// Под < и > понимается следование этих имен в выводимом списке
function FCmp($f1,$f2)
{ // Каталог всегда предшествует файлу
if(is_dir($f1) && !is_dir($f2)) return -1;
// Файл всегда идет после каталога
if(!is_dir($f1) && is_dir($f2)) return 1;
// Иначе сравниваем лексикографически
if($f1<$f2) return -1; elseif($f1>$f2) return 1; else return 0;
}
// Пусть $Files содержит массив с ключами — именами файлов
// в текущем каталоге. Отсортируем его.
uksort($Files, "FCmp"); // передаем функцию сортировки "по ссылке"
?>

Звичайно, зв'язки між ключами і значеннями функцією uksort() зберігаються, тобто, знову ж таки, деякі пари просто "спливають" вгору, а інші - "осідають".

Сортування за значеннями за допомогою функції uasort()

Функція uasort() дуже схожа на uksort(),з тією різницею, що змінної (користувача) функції сортування "підсуваються" не ключі, а чергові значення з масиву. При цьому також зберігаються зв'язку в парах ключ=> значення.

Перевертання масиву за допомогою функції array_reverce()

Функція array_reverse() повертає масив, елементи якого слідують у зворотному порядку щодо масиву, переданого в параметрі. При цьому зв'язку між ключами і значеннями, звичайно, не губляться. Наприклад, замість того, щоб ранжувати масив у зворотному порядку за допомогою arsort(), ми можемо відсортувати його в прямому порядку, а потім перевернути:

$A=array("a"=>"Zero","b"=>"Weapon","c"=>"Alpha","d"=>"Processor");
asort($A);
$A=array_reverse($A);

Звичайно, зазначена послідовність працює довше, ніж один-єдиний виклик arsort().

Сортування списку за допомогою функцій sort() и rsort()

Ці дві функції призначені в першу чергу для сортування списків.

Функція sort() сортує список (зрозуміло, за значеннями) у порядку зростання, а rsort() — в порядку спадання. Приклад для функції sort():

<?php
$A=array("40", "20", "10", "30");
sort($A);
for($i=0; $i<count($A); $i++) echo "$A[$i]"."<br>";
// выводит 10 20 30 40
?>

Перемішування списку за допомогою функції shuffle()

Функція shuffle() "перемішує" список, переданий їй першим параметром, так, щоб його значення розподілялися випадковим чином. Зверніть увагу, що, по-перше, змінюється сам масив, а по-друге, асоціативні масиви воспріімаются як списки. Приклад:

$A=array(10,20,30,40,50);
shuffle($A);
foreach($A as $v) echo "$v ";

Наведений фрагмент коду виводить числа 10, 20, 30, 40 і 50 </strong> у випадковому порядку.

Виконавши цей фрагмент кілька разів, ви можете виявити, що від запуску до запуску черговість проходження чисел не змінюється. Ця властивість обумовлена тим, що функція shuffle()використовує стандартний генератор випадкових чисел, який перед роботою необхідно ініціалізувати за
допомогою виклику srand().

Операції з ключами і значеннями масиву

array_flip(array $arr)

Функція array_flip() "пробігає" по масиву і змінює місцями його ключі і значення. Вихідний масив $arr не змінюється, а результуючий масив просто повертається.
Звичайно, якщо в масиві були присутні кілька елементів з однаковими значеннями, враховуватися буде тільки останній з них:

$A=array("a"=>"aaa", "b"=>"aaa", "c"=>"ccc");
$A=array_flip($A);
// теперь $A===array("aaa"=>"b", "ccc"=>"c");

array_keys(array $arr [,mixed $SearchVal])

Функція array_keys() повертає список, що містить всі ключі масиву $arr. Якщо встановлено необов'язковий параметр $SearchVal, то вона поверне тільки ті ключі, яким відповідають значення $SearchVal.

Фактично, ця функція із заданим іншим параметром є зворотнім по відношенню до оператора [] — !!!!!извлеч!!!!! значення за його ключем.

array_values(array $arr)

Функція array_values() повертає список всіх значень в асоціативному масиві $arr. Очевидно, така дія марна для списків, але іноді виправдана для !!!!хешей!!!!

in_array(mixed $val, array $arr)

Функція in_array() повертає true, якщо елемент зі значенням $val присутній в масиві $arr.
Втім, якщо вам часто доводиться долати цю операцію, поміркуйте: чи не краще буде скористатися асоціативним масивом і зберігати дані в його ключах, а не в значеннях?

array_count_values(list $List)

Функція array_count_values() підраховує, скільки разів кожне значення зустрічається в списку $List, і повертає асоціативний масив з ключами - елементами списку та значеннями - кількістю повторів цих елементів. Іншими словами, функція array_count_values() підраховує частоту появи значень у списку $List. Приклад:

$List=array(1, "hello", 1, "world", "hello");
array_count_values($array);
// возвращает array(1=>2, "hello"=>2, "world"=>1)

Злиття масивів

Злиття (конкатенація) масивів - це операція створення масиву, що складається з елементів декількох інших масивів. Злиття масивів - це дуже небезпечна операція, оскільки результат злиття підпорядковується своєю логікою, забувши про яку можна втратити дані. Злиття масивів реалізується за допомогою оператора "+" або за допомогою функції array_merge(). Злиття списков може здійснюватися тільки за допомогою функції array_merge().

Припустимо, ми маємо два масиви:

$A = array("1"=>"первый", "2"=>"Второй");
$B = array("1"=>"первый", "2"=>"Второй");

Тепер зіллємо дані два масиви в один масив $C:

$C = $A + $B; 

Оператор "+" для масивів не коммутатівен. Це означає, що $A + $B не дорівнює $B + $A.

У результаті розглянутого прикладі ми отримаємо масив $C такого вигляду:

"1"=>"Первый", "2"=>"Второй", "3"=>"Третий", "4"=>"Четвертый"

А в результаті $B + $A ми отримаємо такий масив:

"3"=>"Третий", "4"=>"Четвертый", "1"=>"Первый", "2"=>"Второй"

При злитті списків такий метод не працює. Пояснимо даний факт на прикладі:

Припустимо, у нас є два масиви:

$A = array(10,11,12);
$B = array(13,14,15);

У результаті злиття списків $A і $B ( $A + $B ) ми отримаємо: 10,11,12. А це зовсім не той результат, який ми хотіли отримати ... Пов'язано це з тим, що при злитті списків з однаковими індексами в результуючому масиві залишається елемент першого масиву, причому на тому ж місці. У такому випадку нам необхідно використовувати функцію array_merge()

Функція array_merge()

Функція array_merge() призначена для усунення всіх недоліків,які властиві оператору "+" для злиття масивів. А саме, вона зливає масиви, перераховані в її аргументах, в один великий масив і повертає результат. Якщо в масивах зустрічаються однакові ключі, в результат поміщається пара ключ=>значення з того масиву, який розташований правіше у списку аргументів. Проте це не зачіпає числові ключі: елементи з такими ключами поміщаються в кінець результуючого масиву в будь-якому випадку.
Таким чином, за допомогою array_merge() ми можемо позбутися усіх недоліків оператора "+" для масивів. Ось приклад, що зливає два списки в один:

$L1=array(100,200,300);
$L2=array(400,500,600);
$L=array_merge($L1,$L2);
// теперь $L===array(100,200,300,400,500,600);

Завжди використовуйте цю функцію, якщо вам потрібно працювати саме зі списками, а не зі звичайними асоціативними масивами.

Отримання частини масиву

Для отримання частини масиву можна використовувати функцію<a href="/functions/?array_slice">array_slice()</a>

array_slice(array $Arr, int $offset [, int $len])

Ця функція повертає частину асоціативного масиву, починаючи з пари ключ=> значення зі зміщенням (номером)) $offset від початку і довжиною $len (якщо останній параметр не заданий - до кінця масиву).
Параметри $offset і $len задаються по точно таким же правилам, як і аналогічні параметри в функції substr(). А саме, вони можуть бути негативними (в цьому випадку відлік здійснюється від кінця масиву), і т. д. Ось кілька прикладів:

$input = array ("a", "b", "c", "d", "e");
$output = array_slice ($input, 2); // "c", "d", "e"
$output = array_slice ($input, 2, -1); // "c", "d"
$output = array_slice ($input, -2, 1); // "d"
$output = array_slice ($input, 0, 3); // "a", "b", "c"

Вставка та видалення елементів масиву

Ми вже знаємо кілька операторів, які відповідають за вставку і видалення елементів. Наприклад, оператор [] (порожні квадратні дужки) додає елемент в кінець масиву, привласнюючи йому числовий ключ, а оператор Unset() разом з витягом по ключу видаляє потрібний елемент. Мова PHP підтримує і багато інших функцій, які іноді буває зручно використовувати.

array_push(alist &$Arr, mixed $var1 [, mixed $var2, …])

Ця функція додає до списку $Arr елементи $var1, $var2 і т. д. Вона присвоює їм числові індекси - точно так само, як це відбувається для стандартних []. Якщо вам потрібно додати всього один елемент, напевно, простіше буде скористатися цим оператором:

array_push($Arr,1000); // вызываем функцию…
$Arr[]=100; // то же самое, но короче

Зверніть увагу, що функція array_push() сприймає масив, як стек, і додає елементи завжди в його кінець. Вона повертає нове число елементів у масиві.

array_pop(list &$Arr)

Функція array_pop(), є протилежністю array_push(), знімає елемент з "вершини" стека (тобто бере останній елемент списку) і повертає його, видаливши після цього його з $Arr. За допомогою цієї функції ми можемо будувати конструкції, що нагадують стек. Якщо список $Arr був порожній, функція повертає пустий рядок.

array_unshift(list &$Arr, mixed $var1 [, mixed $var2, …])

Функція array_unshift дуже схожа на array_push(), але додає перераховані елементи не в кінець, а в початок масиву. При цьому порядок проходження $var1, $var2 і т. д. алишається тим же, тобто елементи як би "всувають" в список ліворуч. Новим елементам списку, як зазвичай, призначаються числові індекси, починаючи з 0; при цьому всі ключі старих елементів масиву, які також були числовими, змінюються. Функція повертає новий розмір масиву. Ось приклад її застосування:

$A=array(10,"a"=>20,30);
array_unshift($A,"!","?");
// теперь $A===array(0=>"!", 1=>"?", 2=>10, a=>20, 3=>30)

mixed array_shift(list &$Arr)

Функція mixed array_shift витягує перший елемент масиву $Arr і повертає його. Вона сильно нагадує array_pop(), але тільки отримує початковий, а не кінцевий елемент, а також виробляє досить сильну "струс" всього масиву: адже при отриманні першого елемента доводиться коректувати всі числові індекси у всіх залишилися елементів ...

array_unique(array $Arr)

Функція array_unique() повертає масив, складений з усіх унікальних значень масиву $Arr разом з їх ключами. У результуючий масив поміщаються перші зустрілися пари ключ =>значення:

$input=array("a" => "green", "red", "b" => "green", "blue", "red");
$result=array_unique($input);
// теперь $result===array("a"=>"green", "red", "blue");

array_splice(array &$Arr, int $offset [, int $len] [, int $Repl])

Функція array_splice,також як і array_slice(), повертає подмассів $Arr, починаючи з індексу $offset максимальної довжини $len, але, разом з тим, вона робить і інше корисну дію. А саме, вона заміняє тільки що зазначені елементи на те, що знаходиться в масиві $Repl (або просто видаляє, якщо $Repl не зазначений). Параметри $offset і $len задаються так само, як і у функції substr() — а саме, вони можуть бути і негативними, в цьому випадку відлік починається від кінця масиву. Ось деякі приклади:

<?php
$input=array("red", "green", "blue", "yellow");
array_splice($input,2);
// Теперь $input===array("red", "green")
array_splice($input,1,-1);
// Теперь $input===array("red", "yellow")
array_splice($input, -1, 1, array("black", "maroon"));
// Теперь $input===array("red", "green", "blue", "black", "maroon")
array_splice($input, 1, count($input), "orange");
// Теперь $input===array("red", "orange")
?>

Останній приклад показує, що як параметр $Repl ми можемо вказати і звичайне, значення рядка, а не масив з одного елемента.

Змінні та масиви

compact(mixed $vn1 [, mixed $vn2, …])

Функція compact() упаковує в масив змінні з поточного контексту (глобального чи контексту функції), задані своїми іменами в $vn1, $vn2 і т. д. При цьому в масиві утворюються пари з ключами, рівними вмісту $vnN, і значеннями відповідних змінних. Ось приклад використання цієї функції:

$a="Test string";
$b="Some text";
$A=compact("a","b");
// теперь $A===array("a"=>"Test string", "b"=>"Some text")

Чому ж тоді параметри функції позначені як mixed? Справа в тому, що вони можуть бути не тільки рядками, але і списками рядків. У цьому випадку функція послідовно перебирає всі елементи цього списку, і упаковує ті змінні з поточного контексту, імена яких вона зустріла. Більше того - ці списки можуть, у свою чергу, також містити списки рядків, і т. д. Правда, останнє використовується порівняно рідко, але все-таки от приклад:

$a="Test";
$b="Text";
$c="CCC";
$d="DDD";
$Lst=array("b",array("c","d"));
$A=compact("a",$Lst);
// теперь $A===array("a"=>"Test", "b"=>"Text", "c"=>"CCC", "d"=>"DDD")

extract(array $Arr [, int $type] [, string $prefix])

Функція extract() виробляє дії, прямо протилежні compact(). А саме, вона отримує в параметрах масив $Arr і перетворює кожну його пару ключ=>значення в змінну поточного контексту.

Створення списку - діапазону чисел

range(int $low, int $high)

Ця функція дуже проста. Вона створює список, заповнений цілими числами від $low до $high включно.

Лічильник елементів масиву

Для підрахунку елементів масиву призначена функція count().

Приклад використання функції count():

<?php
$arr[]=5;
$arr[]=4;
$arr[]=8;
$arr[]=3;
$arr[]=8;
echo "<h2>Число элементов массива: ".count($arr)."</h2>";
// Выводит: Число элементов массива: 5
?>

Видалення масиву і його елементів

Якщо ви хочете видалити масив цілком, скористайтеся функцією unset().

Якщо ви хочете видалити пару ключ / значення, ви також можете використовувати функцію unset(). Наведемо конкретні приклади:

<?php
$arr
= array(5 => 1, 12 => 2);
$arr[] = 56; // В этом месте скрипта это
// эквивалентно $arr[13] = 56;
$arr["x"] = 42; // Это добавляет к массиву новый
// элемент с ключом "x"
unset($arr[5]); // Это удаляет элемент из массива

unset($arr); // Это удаляет массив полностью
?>

Деякі особливості роботи з масивами

Перетворення в масив (тип array)

Для будь-якого з типів: integer, float</a>, string, boolean і resource, якщо ви перетворите значення в масив, ви отримаєте масив з одним елементом (з індексом 0), що є скалярним значенням, з якого ви почали.

Якщо ви перетворите в масив об'єкт (object), ви отримаєте в якості елементів масиву властивості (змінні-члени) цього об'єкту. Ключами будуть імена змінних-членів.

Якщо ви перетворите в масив значення NULL, ви отримаєте порожній масив.

Порівняння масивів

Масиви можна порівнювати за допомогою функції array_diff() та операторів масивів:

Оператори, що працюють з масивами::

<colgroup> <col> <col> <col> </colgroup><thead> </thead> <tbody> </tbody>
Пример Название Результат
$a + $b Объединение Объединение массива $a и массива $b.
$a == $b Равно TRUEв случае, если $a и $b содержат одни и те же элементы.
$a === $b Тождественно равно TRUE в случае, если $a и $b содержат одни и те же элементы в том же самом порядке.
$a != $b Не равно TRUE если массив $a не равен массиву $b.
$a <> $b Не равно TRUE если массив $a не равен массиву $b.
$a !== $b Тождественно не равно TRUE если массив $a не равен тождественно массиву $b.

Приклад порівняння масивів:

<?php
$a
= array("apple", "banana");
$b = array(1 => "banana", "0" => "apple");
var_dump($a == $b); // bool(true)
var_dump($a === $b); // bool(false)
?>

Деякі корисні практичні приклади по роботі з масивами

<?php
// это
$a = array( 'color' => 'red',
'taste' => 'sweet',
'shape' => 'round',
'name' => 'apple',
4 // ключом будет 0
);
// полностью соответствует
$a['color'] = 'red';
$a['taste'] = 'sweet';
$a['shape'] = 'round';
$a['name'] = 'apple';
$a[] = 4; // ключом будет 0
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// создаст массив array(0 => 'a' , 1 => 'b' , 2 => 'c'),// или просто array('a', 'b', 'c')
?>

Ще один практичний приклад:

<?php
// Массив как карта (свойств)
$map = array( 'version' => 4,
'OS' => 'Linux',
'lang' => 'english',
'short_tags' => true
);
// исключительно числовые ключи
$array = array( 7,
8,
0,
156,
-
10
);
// это то же самое, что и array(0 => 7, 1 => 8, ...)
$switching = array( 10, // ключ = 0
5 => 6,
3 => 7,
'a' => 4,
11, // ключ = 6 (максимальным числовым индексом был 5)
'8' => 2, // ключ = 8 (число!)
'02' => 77, // ключ = '02'
0 => 12 // значение 10 будет перезаписано на 12
);
// пустой массив
$empty = array();
?>

Коллекция:

<?php
$colors
= array('красный', 'синий', 'зеленый', 'желтый');
foreach (
$colors as $color) {
echo
"Вам нравится $color?\n";
}
?>

Результат роботи розглянутого скрипта:

Вам подобається червоний?
Вам подобається синій?
Вам подобається зелений? 
Вам подобається жовтий? 

Наступний приклад:

<?php
$firstquarter
= array(1 => 'Январь', 'Февраль', 'Март');
print_r($firstquarter);
?>

Результат роботи наведеного скрипта буде наступний:

<tbody> </tbody>
Array 
(
    [1] => 'Январь'
    [2] => 'Февраль'
    [3] => 'Март'
)

Приклад заповнення масиву:

<?php
// заполняет массив всеми элементами директории
$handle = opendir('.');
while (
false !== ($file = readdir($handle))) {
$files[] = $file;
}
closedir($handle);
?>

Упорядкування масивів. Ви можете змінювати порядок елементів, використовуючи різні функції сортування. Для додаткової інформації дивіться розділ функції для роботи з масивами. Ви можете підрахувати кількість елементів у масиві, використовуючи функцію count()</.

Рекурсивні та багатовимірні масиви:

<?php
$fruits
= array ( "фрукты" => array ( "a" => "апельсин",
"b" => "банан",
"c" => "яблоко"
),
"числа" => array ( 1, 2, 3, 4, 5, 6
),
"дырки" => array ( "первая",
5 => "вторая",
"третья"
)
);
// Несколько примеров доступа к значениям предыдущего массива
echo $fruits["дырки"][5]; // напечатает "вторая"
echo $fruits["фрукты"]["a"]; // напечатает "апельсин"
unset($fruits["дырки"][0]); // удалит "первая"
// Создаст новый многомерный массив
$juices["яблоко"]["зеленое"] = "хорошее";
?>

Зверніть увагу, що при присвоєнні масиву завжди відбувається копіювання значення. Щоб копіювати масив за посиланням, вам потрібно використовувати оператор посилання:

<?php
$arr1
= array(2, 3);
$arr2 = $arr1;
$arr2[] = 4; // $arr2 изменился,
// $arr1 по прежнему array(2,3)
$arr3 = &$arr1;
$arr3[] = 4; // теперь $arr1 и $arr3 эквивалентны
?>