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

Матеріал з Вікі ЦДУ
Перейти до: навігація, пошук

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

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

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

Функція 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); // Это удаляет массив полностью
?>