PHP: масив в масиві. Пошук в масиві PHP
Програмування - це синтаксис і семантика. Перше визначається правилами мови, друге - досвідом розробника. Щодо масивів розробник може предметно навантажити синтаксис семантикою. Це ще не об'єкт, але вже не масив в традиційному розумінні. PHP дає можливість створювати масиви змінних різних типів, включаючи самих себе. Елементом масиву може бути функція, тобто можливість навантажити масив реальним алгоритмом, реальним змістом. Синтаксис стабільний, але змінюється від версії до версії, і не завжди може бути сумісним навіть знизу вгору. Переносимість програм - добре забуте досягнення минулого століття. Семантика розвивається і завжди може бути застосована не тільки в будь-версії будь-якого мови; стало традицією використовувати синтаксичні конструкції для вираження того, що правилами мови навіть не було передбачено. На прикладі масивів це можна зрозуміти найбільш просто.
$cFutureArray = "; for ($i=0; $i 0) {$cFutureArray .= '|';} if (checkFunc($cSrcLine, $cUserLine) {$cFutureArray .= 'Yes'; } else {$cFutureArray .= 'No';} } $aResult = explode('|', $cFutureArray);
Масив - важлива конструкція даних у ході проектування і розробки. Його багатовимірний варіант колись був популярний, але з плином часу залишилася потреба в масивах максимум двох-трьох розмірностей. Так простіше і зрозуміліше, а з точки зору професійності коли щось починає множитися, значить, щось у постановці задачі або в коді йде не так.
Дуже ефективно створювати щось тільки тоді, коли це потрібно, в тому вигляді, в якому воно було потрібно, і знищувати, коли в ньому зникла необхідність. Використовуючи в якості ключів (індексів) осмислені імена, можна одержати читабельні конструкції, осмислені в контексті поточного місця в алгоритмі: $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]) . ' '; //другий PHP-масив в рядок
$sOne .= $aTable[1] ['work']; //звернення до одного елементу другого масиву Результат роботи цього прикладу (перший масив - звичайний, ключі в ньому починаються з 0 другий масив - асоціативний, в ньому чотири ключа: 'name', 'age', 'work', 'active'): $sOne = 'Петров; 34; Менеджер; 1 Менеджер'; На цьому простому прикладі можна бачити, як створена анкета може бути застосована до всіх співробітників. Можна створити масив співробітників з індексами по табельним номерам і, якщо потрібен буде конкретний співробітник, то вибрати його за табельним номером. Якщо в організації є підрозділи, чи є сезонні робочі, чи потрібно окремо виділити працюючих пенсіонерів, конструкція "PHP-масив в масиві" дуже зручна, але ніколи не слід захоплюватися розмірністю. Два-три виміри - межа для ефективного рішення.
$aLine[iconv ('UTF-8', 'CP1251', "овощ")]= iconv ('UTF-8', 'CP1251', "огірок");
$aLine[]= iconv ('UTF-8', 'CP1251', 'баклажан'); в результаті виконання циклу: foreach ($aLine as $ck => $cv) {
$cOne .= $ck . '=' . $cv . ' ';
} буде отримано: фрукт=апельсин
0=персик
овоч=огірок
1=баклажан PHP-ключ масиву при додаванні елементів 'персик' і 'баклажан' формується послідовно від 0 а при зазначенні його значення буде дорівнює цьому значенню.
овоч=огірок
1=баклажан Варіантів маніпулювання елементами масивів можна сконструювати безліч. Наприклад, використовуючи функції: implode() і explode(), можна записати PHP-масив в рядок одним роздільником, а розібрати назад в інший масив по - іншому роздільником. Щоб просто на PHP видалити масив цілком, досить написати: unset($aLine); Цього достатньо.
'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]можна отримати ідеальний пошук і швидкий результат.
$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".
Конструювання масивів
Масив 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 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-масив в масиві» від ZF 2. Не надто надихає спочатку, але це працює і, можливо, робить даний фреймворк успішним (приклад з модуля 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]) . ' '; //другий PHP-масив в рядок
$sOne .= $aTable[1] ['work']; //звернення до одного елементу другого масиву Результат роботи цього прикладу (перший масив - звичайний, ключі в ньому починаються з 0 другий масив - асоціативний, в ньому чотири ключа: 'name', 'age', 'work', 'active'): $sOne = 'Петров; 34; Менеджер; 1 Менеджер'; На цьому простому прикладі можна бачити, як створена анкета може бути застосована до всіх співробітників. Можна створити масив співробітників з індексами по табельним номерам і, якщо потрібен буде конкретний співробітник, то вибрати його за табельним номером. Якщо в організації є підрозділи, чи є сезонні робочі, чи потрібно окремо виділити працюючих пенсіонерів, конструкція "PHP-масив в масиві" дуже зручна, але ніколи не слід захоплюватися розмірністю. Два-три виміри - межа для ефективного рішення.
Ключі для роботи з масивами
Якщо раніше мало значення, як все влаштовано, то в останні роки традиції бінарної епохи, коли програміст хотів знати, як саме зберігаються елементи масиву, і бажав мати до них прямий доступ, забулися остаточно. З'явилося багато кодувань символів, які займають в пам'яті далеко не один байт. Слово "біт" можна зустріти тепер хіба що в операціях бітового пошуку, але пошук у масиві PHP - це окрема тема. Доступ до елементів може бути простим і асоціативним. У першому випадку елементи масиву мають будь-який з доступних в PHP типів) нумеруються 012 У другому випадку програміст вказує власний індекс, частіше іменований "ключ" для доступу до потрібного значення. $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 . ' ';
} буде отримано: фрукт=апельсин
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-значення в масиві може бути «російським», але ключ на нього повинен бути синтаксично некоректним не тільки з позицій цієї мови, але і з позицій середовища його роботи.Читайте також
Компютер і інтернет
Функція Scanf C: опис
Компютер і інтернет
JavaScript: typeof - необхідність чи нові можливості
Компютер і інтернет
PHP: останній елемент. Масив в динаміці
Компютер і інтернет
Ефективні цикли foreach: PHP і правильні масиви
Компютер і інтернет
PHP 7: що нового і коли вийде?
Компютер і інтернет
"Я фармлю" — що це значить? Як швидко і правильно фарм?
Компютер і інтернет
Що таке Паскаль. Програмування на Паскалі
Компютер і інтернет
Умовне форматування в Excel. Приклади, колірна шкала, набори значків