Новини високих технологій
» » Foreach PHP: останній елемент

Foreach PHP: останній елемент

5-03-2017, 22:30
1 004
В масивах на PHP є дві цікаві можливості: рух foreach і останній елемент. Тобто в прямому і зворотному напрямках. Мова надає жодної змінної право змінювати свій тип на свій розсуд, а елемент масиву - теж змінна. Якщо врахувати, що в масиві є покажчик на активний елемент і ним можна управляти, як завгодно, то при недогляді розробника, чудес у програмі буде не злічити, а її поведінка буде «самостійним».
Foreach PHP: останній елемент

«Масивні» можливості PHP

Масиви завжди були затребуваним поняттям в програмуванні, а останнім часом придбали новий сенс і синтаксичні форми. Цикл foreach PHP і поняття «останній елемент» в деякому сенсі еквівалентні, а відрізняються тільки напрямком руху: foreach(); array_pop(). В обох випадках можна створювати масиви, як виходить, а подивитися завжди можна все. Обидва випадки відкривають можливість укласти в синтаксис PHP власну семантику. У першому випадку офіційно цикл переглядає всі елементи в порядку їх появи в масиві або у тому порядку, який склався після маніпуляцій з ним. У другому випадку процес той же, але відбувається з хвоста масиву до його початку.

При виникненні проблем PHP декларує помилку елемента. Якщо у якості параметра використовується не масив, у першому разі маємо повідомлення PHP: warning invalid argument supplied for foreach, у другому - помилку рівня E_WARNING, тобто «нічого страшного, але проблеми будуть потім».

Про порядок у масивах

Поява асоціативних масивів ознаменувало собою банальну зміну ставлення до них. Якщо програміст не контролює ситуацію - проблем не уникнути. Багато завдання або частини алгоритму наказують створювати впорядковані масиви і тоді ключі завжди йдуть по порядку. Коли можна видалити елемент, а ключі, наступні за ним, не з'їжджають вперед, то масив мало чим відрізняється від асоціативного. Хіба що розробник не доклав руку до того, як назвати той чи інший елемент масиву. Звичайний перебір елементів в циклі for() цікавий і має сенс, коли ключі йдуть послідовно. У кожного масиву завжди є ключ по порядку. Коли видаляється елемент, що утворюється порожнє місце і в циклі for() буде помилка.

При переборі масиву допомогою foreach() або array_pop() проблем не буде ніколи, але тільки в першому випадку масив залишиться, у другому - він зникне.

Про передбаченому синтаксисі

Цикл foreach в PHP має звичну форму. Можна вказати перебір як є: ($aPass as $cLine), а можна з зазначенням ключа: ($aPass as $cKey => $cLine). Цикл допомогою array_pop($aPass) - з області стекових експромтів минулого, хоча актуальних і цікавих у цьому. Це не цикл зовсім, а просто видача останнього елемента масиву, при якій він видаляється з масиву. Коли оператор foreach PHP починає роботу, внутрішній покажчик масиву завжди встановлюється на його перший елемент. Зміна вказівника всередині циклу може призвести до чудес. Важливо те, що змінна $cLine - не вказує на елемент масиву $aPass, а містить його значення, тому якщо необхідно змінити елемент масиву, слід поставити перед нею символ &. В такому випадку $cLine буде посиланням на елемент масиву, а не його значенням.

Помилки foreach, PHP останній елемент = ок!

Яка помилка цінніше: фатальна або пропускається - це, як приправа, на смак розробника з урахуванням адекватної реакції замовника. Якщо елемент був видалений з масиву, то це помітить тільки цикл for. Цикл foreach PHP і array_pop PHP тут абсолютно лояльні.
Якщо елемент не того типу, це буде помітно так само, як і в основному тілі програми. Якщо параметр foreach потрапляє не масив або об'єкт - буде Invalid argument , хоча варіант з array_pop зазвичай нереальний. Але коли таке все-таки відбудеться, то крім NULL нічого не буде.

Масиви та об'єкти

PHP надає можливість розглядати об'єкти як масиви. Який у цьому сенс сказати важко, але подібне доступно. Масиви можуть містити значення будь-якого типу і змінювати його в процесі виконання програми. Природно, елементом масиву може бути інший масив або об'єкт. Рівень вкладеності обмежений здоровим глуздом. Оператори і конструкції мови не мають нічого спільного ні з рекурсією, ні з рівнем вкладеності. Це серйозне відставання синтаксису керуючих конструкцій від синтаксису опису даних. Розробники звикли до таких явищ, як PHP масиви, foreach, array_pop, тому працювати з ними зручно.


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

Масиви об'єктів (початок)

Треба віддати належне, що поява парочки foreach/array_pop не змусило себе довго чекати, але це тільки половина справи. За великим рахунком циклів for(){}, while() {} і do{}while() давно пора взяти на себе належний контроль за порожнечами в масивах і рішення проблеми рекурсії, коли елементом є масив. Однак свідомість розробника донині пам'ятає непорушною доктрину: масив - це безліч елементів, де елемент-масив - це інша сутність, яку потрібно обробляти відповідно. Проблема тут не підлягає вирішенню в осяжному майбутньому, навіть з урахуванням зростання швидкості розвитку інформаційних технологій. Внаслідок чого доводиться задовольнятися тим, що є.

Найпростіші масиви (вставка)

Самий примітивний випадок, коли елементи масиву - це числа, рядки, інші елементи незмінного складу і позначення.
Наприклад, цифри двійкової системи обчислення. Аналогічно: вісімковій; десяткової; шістнадцятковій. Сказати, що найпростішим буде масив місяців можна, але тільки при певних умовах, оскільки в більшості випадків потрібно цифрове подання місяця, трибуквенне, російська, китайська, повне або ще яку-небудь. Однозначно найпростішим буде масив букв алфавіту. У найпростіший масив можна визначити все те, що зазвичай називається константами і незмінно для розв'язуваної задачі.

Масиви об'єктів (продовження)

Якщо відмовитися від будь-яких інших варіантів типу елемента, крім об'єкта і найпростішого масиву, то все вийде абсолютно чудово навіть у руках сучасних керуючих конструкцій мови, що зберегли свою сутність з давніх часів.
Відомо, що об'єкт поєднує дані і методи, пам'ять і дію. Загальна практика об'єктно-орієнтованого програмування, що розуміється багатьма, це якийсь абстрактний об'єкт, у якого нічого немає, а все тільки намічається.
Прекрасний стан речей, розвиваючи ланцюжок спадкоємців від абстрактного об'єкта, отримуємо можливість формувати масиви однотипних даних - абстрактних об'єктів. Якими саме вони будуть в кожному конкретному випадку - справа техніки і, переклавши турботу про реалізацію семантики в руки кожного конкретного нащадка відповідно до його сутності, отримаємо бажане.
Цікаво по темі
Ефективне програмування на PHP: масиви в рядок
Ефективне програмування на PHP: масиви в рядок
PHP, як сучасна мова програмування, надає можливість обробляти дані, тип яких можна визначити в момент ...
Мова програмування Python: цикли
Мова програмування Python: цикли
У мові програмування Python (також «Пайтон» або «Пітон») є кілька способів зациклення деякої дії. Основні інструменти реалізації якої-небудь ітерації
Javascript Array для збереження необмеженої кількості змінних
Javascript Array для збереження необмеженої кількості змінних
Логічно масив займає проміжне положення між змінними і об'єктами. Практично не слід надавати особливого значення словам. У програмі є змінні і код.
Java Array. Масиви в Java. Java для початківців
Java Array. Масиви в Java. Java для початківців
Для роботи з великою кількістю значень в Java, як у більшості сучасних високорівневих мов програмування, є такий потужний інструмент, як масиви.
Нескінченний for (Java) цикл
Нескінченний for (Java) цикл
Одними з ключових елементів ядра мови Java є цикли, що дозволяють виконувати повторювані операції певну кількість разів. Даний інструмент значно
JavaScript цикли: for, while, do-while
JavaScript цикли: for, while, do-while
Фундаментальні конструкції будь-якої мови - цикли. Але якщо оператор присвоювання поки ще не викликає сумнівів у доцільності, то далеко не всякий