PHP: масив в масиві. Пошук в масиві PHP
Програмування - це синтаксис і семантика. Перше визначається правилами мови, друге - досвідом розробника. Відносно масивів розробник може предметно навантажити синтаксис семантикою. Це ще не об'єкт, але вже не масив в традиційному розумінні. PHP дає можливість створювати масиви з змінних різних типів, включаючи самих себе. Елементом масиву може бути функція, тобто можливість навантажити масив реальним алгоритмом, реальним змістом.
Синтаксис стабільний, але змінюється від версії доверсії і не завжди може бути сумісним навіть від низу до верху. Переносимість програм - добре забуте досягнення минулого століття. Семантика розвивається і завжди може бути застосована не тільки в будь-якої версії будь-якої мови; стало традицією використовувати синтаксичні конструкції для вираження того, що правилами мови навіть передбачено не було. На прикладі масивів це можна зрозуміти найбільш просто.
конструювання масивів
Масив в PHP має зручний синтаксис і функціональність. Цей тип даних можна описати попередньо, але часто зручно створювати масиви на льоту в міру необхідності.
public $ aNone = array (); // масив описаний і нічого не містить
public $ aFact = array ( "авокадо", "персик", "вишня"); // в цьому масиві три елементи
Створення масиву в процесі перевірки будь-якої умови:
$ CSrcLine = "рядок аналізованих даних";
for ($ i = 0; $ i <13; $ i ++) {
$ CUserLine = inputUserLine (); // введення чогось
if (checkFunc ($ cSrcLine, $ cUserLine) {
$ AResult [] = "Yes"; // додати в масив PHP
} Else {
$ AResult [] = "No";
}
}
В результаті виконання даного прикладу створитьсямасив з 13 елементів, значеннями якого будуть тільки рядка "Yes" або "No". Елементи отримають індекси від 0 до 12. Той же ефект можна отримати, попередньо записавши "майбутній" PHP-масив в рядок:
$ CFutureArray = "";
for ($ i = 0; $ i <13; $ i ++) {
$ CUserLine = inputUserLine (); // введення чогось
if ($ i> 0) {$ cFutureArray. = "|"; }
if (checkFunc ($ cSrcLine, $ cUserLine) {$ cFutureArray. = "Yes";
} Else {$ cFutureArray. = "No"; }
}
$ AResult = explode ( "|", $ cFutureArray);
багатовимірні масиви
Багато системи управління сайтами (СМС)використовують масиви «з розмахом». З одного боку, це хороша практика, з іншого боку, це ускладнює застосування. Навіть якщо автору зрозуміла доктрина "PHP-масив в масиві", то не слід їй зловживати: не тільки розробнику доведеться звикати до складної нотації. Часто через час сам творець буде довго згадувати, що писав спочатку:
return array (
"View_manager" => array (41, "template_path_stack" => array (__DIR__. "/../view",),
"Router" => array ( "routes" => array ( "sayhello" => array (
"Type" => "ZendMvcRouterHttpLiteral",
"Options" => array ( "route" => "/ sayhello", "defaults" => array (
"Controller" => "HelloworldControllerIndex", "action" => "index",))))),
"Controllers" => array ( "invokables" => array (
"HelloworldControllerIndex" => "HelloworldControllerIndexController"))
);
Це зразок практики «PHP-масив в масиві» від ZF2. Чи не занадто надихає спочатку, але це працює і, можливо, робить даний фреймворк успішним (приклад з модуля ZendSkeletonApplication / module / Helloworld / config / module.config.php).
Масив - важлива конструкція даних в ходіпроектування і розробки. Його багатовимірний варіант колись був популярний, але з плином часу залишилася потреба в масивах максимум двох-трьох розмірностей. Так простіше і зрозуміліше, а з точки зору професійності коли щось починає множиться, значить, щось в постановці завдання або в коді йде не так.
Просто, доступно і зрозуміло
Створюючи на php масив в масиві, найкращеобмежуватися двома-трьома рівнями. Незважаючи на стабільність і надійність PHP припускається помилок при обробці синтаксичних конструкцій. З цим миритися можна, маючи хороший редактор коду, звикнувши точно вважати дужки і коми. Однак PHP не контролює типи даних (це карма сучасного програмування) і дозволяє розробнику практикувати семантичні помилки.
Правило контролювати типи змінних абовласні ідеї перетворення семантики в синтаксис - часто недозволена розкіш. Це втрата швидкості скрипта, читабельності коду, ... тому простота в кодуванні завжди має істотне значення.
У PHP є суттєва негативна риса: при виникненні невизначеності скрипт просто зависає. Не всі отладчики справляються з непередбаченими обставинами, і багато що залежить від досвіду і інтуїції розробника. Чим простіше алгоритм, чим доступніше структурована інформація, тим більше шансів знайти помилку або зовсім не допустити її.
Характерно, що коли з'явилися перші масиви,були запропоновані варіанти даних у вигляді структур - незграбна спроба створити щось з різних типів даних. Перші вижили і придбали новий ефективний синтаксис, другі пішли в історію.
Прості і асоціативні масиви
Запис двовимірного масиву - це ще одна парадужок "[" і "]", наприклад: $ aSrcData [1] [2] означає звернення до елементу [2] масиву [1], що входить в масив $ aSrcData. У PHP немає вимоги оголошувати заздалегідь дані. Любою заявлену інформацію завжди можна перевірити на предмет існування.
Дуже ефективно створювати щось тільки тоді,коли це потрібно, в тому вигляді, в якому воно було потрібно, і знищувати, коли в ньому зникла необхідність. Використовуючи в якості ключів (індексів) осмислені імена, можна отримати читабельні конструкції, осмислені в контексті поточного місця в алгоритмі:
$ AAnketa [ "name"] = "Іванов";
$ AAnketa [ "age"] = 42;
$ AAnketa [ "work"] = "Директор";
$ AAnketa [ "active"] = true;
$ ATable [] = $ aAnketa;
$ AAnketa [ "name"] = "Петров";
$ AAnketa [ "age"] = 34;
$ AAnketa [ "work"] = "Менеджер";
$ AAnketa [ "active"] = true;
$ ATable [] = $ aAnketa;
$ AAnketa [ "name"] = "Афанасьєв";
$ AAnketa [ "age"] = 28;
$ AAnketa [ "work"] = "Робочий";
$ AAnketa [ "active"] = false;
$ ATable [] = $ aAnketa;
$ SOne. = Implode ( ";", $ aTable [1]). "<br/>"; // другий PHP-масив в рядок
$ SOne. = $ ATable [1] [ "work"]; // звернення до одного елементу другого масиву
Результат роботи цього прикладу (перший масив - звичайний, ключі в ньому починаються з 0, другий масив - асоціативний, в ньому чотири ключа: "name", "age", "work", "active"):
$ SOne = "Петров; 34; Менеджер; 1 <br/> Менеджер";
На цьому простому прикладі можна бачити, якстворена анкета може бути застосована до всіх співробітників. Можна створити масив співробітників з індексами по табельною номерами і, якщо потрібен буде конкретний співробітник, то вибрати його по табельної номером.
Якщо в організації є підрозділи, або єсезонні робітники, або потрібно окремо виділити працюючих пенсіонерів, ... конструкція "PHP-масив в масиві" дуже зручна, але ніколи не слід захоплюватися розмірністю. Два-три виміри - межа для ефективного вирішення.
Ключі для роботи з масивами
Якщо раніше мало значення, як все влаштовано, тов останні роки традиції бінарної епохи, коли програміст хотів знати, як саме зберігаються елементи масиву, і бажав мати до них прямий доступ, забулися остаточно. З'явилося багато кодувань символів, які займають в пам'яті далеко не один байт. Слово "біт" можна зустріти тепер хіба що в операціях битового пошуку, але пошук в масиві PHP - це окрема тема. Доступ до елементів може бути простим і асоціативним. У першому випадку елементи масиву (мають будь-який з доступних в PHP типів) нумеруються 0, 1, 2, ... У другому випадку програміст вказує власний індекс, іменований частіше "ключ" для доступу до потрібного значення.
$ ALine [ "фрукт"] = "апельсин"; // тут PHP-ключ масиву = "фрукт"
або (щоб все було коректно з дотриманням кодування сторінки і коду):
$ ALine [iconv ( "utf-8", "CP1251", "фрукт")] = iconv ( "utf-8", "CP1251", "апельсин");
При додаванні до масиву $ aLine нового значення:
$ ALine [] = iconv ( "utf-8", "CP1251", "персик");
$ ALine [iconv ( "utf-8", "CP1251", "овоч")] = iconv ( "utf-8", "CP1251", "огірок");
$ ALine [] = iconv ( "utf-8", "CP1251", "баклажан");
в результаті виконання циклу:
foreach ($ aLine as $ ck => $ cv) {
$ COne. = $ Ck. "=". $ Cv. "<br/>";
}
буде отримано:
фрукт = апельсин
0 = персик
овоч = огірок
1 = баклажан
PHP-ключ масиву при додаванні елементів "персик" і "баклажан" формується послідовно від 0, а при вказуванні його значення буде дорівнює цьому значенню.
Видалення елементів з масиву
Найпростіше видалити елемент масиву PHP в ходійого обробки. В цьому випадку, наприклад, в результаті виконання циклу, вихідний масив проглядається, і формується новий, в який непотрібні елементи просто не записуються.
Можна зробити простіше. Якщо до останнього наприклад застосувати:
unset ($ aLine [0]); // видалити елемент масиву PHP
то результат буде:
фрукт = апельсин
овоч = огірок
1 = баклажан
Варіантів маніпулювання елементами масивівможна сконструювати безліч. Наприклад, використовуючи функції: implode () і explode (), можна записати PHP-масив в рядок з одним роздільником, а розібрати назад в інший масив - по іншому разделителю.
Щоб просто на PHP видалити масив цілком, досить написати: unset ($ aLine);
Цього достатньо.
Пошук в масиві
PHP містить спеціальні функції пошукуarray_keys (), array_values (), array_key_exists (), і in_array (), однак перш ніж вирішити їх використовувати, слід розглянути можливість виконати пошук в масиві PHP власними силами.
Будь-який проект є конкретна предметна область,сконструйовані масиви, особливо коли частина семантики перенесена в синтаксис і представлена набором цілком конкретних осмислених ключів. Це дозволяє виконувати власні функції пошуку, які також можна позначити осмислено.
В PHP можна викликати функції, ім'я яких визначається в ході виконання програми. Дуже практичний приклад з бібліотеки PHPWord, яка дозволяє читати і створювати документи MS Word:
$ Elements = array ( "Text", "Inline", "TextRun", "Link", "PreserveText", "TextBreak",
"ListItem", "ListItemRun", "Table", "Image", "Object", "Footnote",
"Endnote", "CheckBox", "TextBox", "Field", "Line");
$ Functions = array ();
for ($ i = 0; $ i <count ($ elements); $ i ++) {
$ Functions [$ i] = "add". $ Elements [$ i];
}
В результаті масив $ functions отримає значення масиву $ elements, тобто імена реальних функцій, які виконують роботу з реальними елементами документа.
Викликаючи для $ elements [4] функцію $ functions [4], можна отримати ідеальний пошук і швидкий результат.
Сортування елементів
Завдання сортування даних має важливе значення, іPHP пропонує кілька функцій для цього: sort (), rsort (), asort (), ksort (), ... За зростанням і спаданням елементів другі дві функції зберігають відносини між ключами і значеннями. Іноді має сенс перемішати значення масиву випадковим чином - shuffle ().
Використовуючи функції PHP для сортування, не слідзабувати, що елементи можуть мати не тільки різний тип, але і не зовсім природний вміст. В першу чергу потрібно дуже уважно ставитися до сортування рядків, що містять російські букви, сортуванні дати, а також чисел, які записані в різних форматах.
Кращий спосіб написати самостійно ідеальне рішення, в усякому разі на етапі тестування скрипта, - це ручне сортування. Вона допоможе передбачити непередбачені ситуації.
рядкові масиви
Завдяки функціям implode () і explode () масивможна легко трансформувати в рядок і отримати назад. Це дозволяє зберігати дані в компактному поданні і розгортати їх у зручний стан у міру потреби.
Масив, звернений в рядок, відкриває нові можливості. Наприклад, завдання пошуку ключових слів у тексті вимагає того, щоб знайдене не додають повторно.
$ CSrcLine = "Text Text ListItemRun TextBox ListItem TextBox Check Box CheckBox TextBox Footnote";
$ ASrc = explode ( "", $ cSrcLine);
$ CDstLine = "";
for ($ i = 0; $ i <count ($ aSrc); $ i ++) {
$ CFind = "[". $ ASrc [$ i]. "]";
if (! is_integer (strpos ($ cDstLine, $ cFind))) {
$ CDstLine. = $ CFind;
}
}
$ ADst = explode ( "] [", $ cDstLine);
$ COne = implode ( ";", $ aDst);
В результаті змінна $ cOne отримає тільки ті значення з початкового рядка, які там зустрічаються по одному разу: "Text; ListItemRun; TextBox; ListItem; Check; Box; CheckBox; Footnote".
Російська мова в ключах і значеннях
Не рекомендується використовувати нічого, що пов'язаноз національними кодуваннями, в синтаксичних конструкціях. Російська мова, як і всі інші мови, символи яких виходять за межі a-z, не створюватиме проблем, перебуваючи в області даних, але не в синтаксисі коду. Іноді навіть просте завдання на PHP «вивести масив на принтер або на екран» призведе до "кракозябрами", а частіше просто зупинить скрипт.
PHP - лояльний мову і терпимо ставиться донаціональним кодувань, але існує маса ситуацій, коли виконаний обсяг робіт доводиться робити повторно тільки тому, що в потрібному місці і в потрібний час вискочить ключове значення, розпізнати яке буде неможливо.
Синтаксис PHP і оточення мови
Слід пам'ятати, що синтаксис PHP - це одне, алеконструкції цього синтаксису «мають справу» з іншими додатками, з операційною системою, з апаратними опціями. Варіантів багато, передбачити все ніколи не представляється можливим.
Правило «в коді є тільки код, а на вході,всередині, і на виході є будь-яка інформація »допоможе уникнути непередбачених несподіванок. PHP-значення в масиві може бути «російським», але ключ на нього повинен бути синтаксично коректним не тільки з позицій даного мови, а й з позицій середовища його роботи.