
Приклад 2
Нехай масив Температура(День), як і в прикладі 2.2, вже оголошений і заповнений значеннями з табл. 2.1. Складемо алгоритм і напишемо програму знаходження мінімальної і максимальної температури червня в місті N.
Алгоритм, що ми пропонуємо, дуже популярний у програмістів. Він заснований на висуванні двох гіпотез:
Максимальним елементом масиву є його перший елемент.
Мінімальним елементом масиву також є його перший елемент.
Ці гіпотези виражаються так: те саме значення Температура(1) привласнюється двом змінним: Мах і Min.
Потім за допомогою циклу з лічильником масив проглядається (сканується) від його другого елемента і до кінця. На кожнім кроці цього процесу черговий елемент масиву порівнюється з гіпотетичними максимальним і мінімальним значеннями (значеннями змінних Мах і Min).
Якщо черговий елемент масиву виявляється більшим від гіпотетичного максимального значення, коректується перша гіпотеза, — максимальним призначається нове значення (змінюється значення змінної Мах).
Аналогічно, якщо черговий елемент масиву виявляється меншим від гіпотетичного мінімального значення, коректується друга гіпотеза про мінімальне значення (змінюється значення змінної Min).
По закінченні перегляду масиву відкоректовані гіпотези перетворюються у розв'язок даної задачі.
Програма мовою Visual Basic, у якій реалізований даний алгоритм, виглядає більш ясною і лаконічною, ніж цей алгоритм у словесному виразі:
Тільки що розглянутий алгоритм і програму цілком можна вважати універсальною — пошук максимального і мінімального елемента може зустрітися в різних задачах. Тому має сенс оформити цю програму у вигляді процедури. В цій процедурі масив буде вхідним параметром. А, тому що ми заздалегідь не знаємо, яка розмірність цього масиву, ми повинні представити її теж у вигляді вхідного параметра. При цьому в списку параметрів процедури після імені масиву повинні стояти «порожні» дужки. Код 2.4 демонструє визначення зазначеної процедури.
Зверніть увагу на те, що в даному визначенні використані типи змінних, що відрізняються від тих, котрі ми застосовували в коді 2.3. Це пояснюється тим, що процедура МаксМін має універсальний характер і може бути застосована до числових масивів досить великого розміру. Максимальне значення індексу масиву може досягати максимально можливого значення змінної типу Long. А числа можуть мати не звичайну, а подвійну точність.
Операції над масивами
Сортування масивів
У 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().
Перевертання масиву за допомогою функції array_reverce()
Функція array_reverse() повертає масив, елементи якого слідують у зворотному порядку щодо масиву, переданого в параметрі. При цьому зв'язку між ключами і значеннями, звичайно, не губляться. Наприклад, замість того, щоб ранжувати масив у зворотному порядку за допомогою arsort(), ми можемо відсортувати його в прямому порядку, а потім перевернути:
$A=array("a"=>"Zero","b"=>"Weapon","c"=>"Alpha","d"=>"Processor");
asort($A);
$A=array_reverse($A);
Звичайно, зазначена послідовність працює довше, ніж один-єдиний виклик arsort().
Операції з ключами і значеннями масиву
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() — а саме, вони можуть бути і негативними, в цьому випадку відлік починається від кінця масиву.
Змінні та масиви
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().
Видалення масиву і його елементів
Якщо ви хочете видалити масив цілком, скористайтеся функцією unset().
Якщо ви хочете видалити пару ключ / значення, ви також можете використовувати функцію unset(). Наведемо конкретні приклади:
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // В этом месте скрипта это
// эквивалентно $arr[13] = 56;
$arr["x"] = 42; // Это добавляет к массиву новый
// элемент с ключом "x"
unset($arr[5]); // Это удаляет элемент из массива
unset($arr); // Это удаляет массив полностью
Зміст
1)Масиви.
2)Оголошення масивів.
3)Базові операції при роботі з масивами.