PHP-массив: удалить элемент первый, последний, по значению
Массивы PHP используются повсеместно. Добавление и изменение значений, как правило, не вызывает затруднений.
Удаление элементов массива - особенная операция. Можно просто удалить элемент, а можно удалить и использовать. Этот нюанс дает большие возможности.
Массивы PHP
PHP - это современный язык программирования, функциональность в части работы с массивами выполнена на высоком уровне. Программист имеет возможность использовать обычные и ассоциативные массивы, проектировать многомерные структуры данных, иметь в качестве элементов массива значение любого типа.
Есть развитый набор функций по работе с массивами, специальные синтаксические конструкции. Имеется возможность обходить массив по своему алгоритму и назначать собственные функции обработки.
Примеры создания и использования массива
Функция scPrint - вспомогательная. Она рекурсивно записывает массив в строку символов для демонстрации получаемых результатов.
Массив $aFruits создается обычным образом: перечисляются значения, индексы назначаются автоматически с нуля. Последняя запятая не имеет значения и не приводит к созданию еще одного пустого элемента.
Массив $aData создается пустым, потом в него вносятся значения. Три - автоматом, а два - с ассоциативными индексами, которые не влияют на общую нумерацию значений. Так, элементы 'слива' и 'персик' имеют индексы 'новая' и 'свежий' соответственно.
Массив $aInfo - многомерный и ассоциативный.
Как в PHP-массиве удалить элемент, показывают три операции удаления.
Первая операция удаляет второй элемент из массива $aFruits, у него индекс равен 1. Следует отметить, что следующие за ним индексы не сдвигаются, значит, в циклических операциях с таким массивом следует предусмотреть проверку существования элемента.
Вторая операция - удаляет последний и первый элементы в массиве $aData, что подтверждает отсутствие влияния удаления на индексы и возможность одновременного удаления нескольких элементов.
Третья - удаляет массив в массиве и элемент в массиве, входящий в другой массив.
Обычное удаление элементов - unset
Функция unset удаляет. Неважно, что. Это может быть просто переменная или элемент массива. Считается, что unset() - это оператор языка, а не функция. Никакого значения этот оператор не возвращает, а то, что ему передано в качестве параметров, он «разрушает». Переменная или массив исчезают, как будто их не было.
На PHP удалить пустые элементы массива можно по-разному, собственно, что считать пустым элементом - зависит от программиста. Однако не слишком разумно использовать для этого несколько параметров в операторе unset(). Практичнее групповые операции выносить в групповые функции.
Современные компьютеры очень быстро работают, а PHP очень скор. Но это не повод создавать и обрабатывать тонны информации громоздкими алгоритмами, это объективное основание подойти к процессу удаления элементов массива прогрессивными способами.
Удаление элементов строчными методами
На PHP удалить пустые элементы массива можно оптом, преобразовав массив в строку и вернув его обратно. Но этот случай годится только для реально пустых элементов, пропущенных индексов или с целью переиндексации массива.
Понятие пустого элемента зависит от задачи. Часто пустым становится существующий элемент массива, в котором содержатся определенные сведения. Например, в массиве ведется учет посетителей. Элемент массива содержит:
- время прихода посетителя;
- текущий режим работы;
- активную страницу;
- время последнего действия.
Если разница между временем прихода и временем последнего действия составляет более 1 минуты (или иное значение), можно считать, что клиент покинул сайт. Записи о таких клиентах можно удалять, если стоит задача мониторить список активных посетителей и не использовать более совершенные методы с использованием JavaScript.
Однако «строчная» обработка хороша. Например, на PHP удалить повторяющиеся элементы массива можно так:
Быстрый и доступный способ. Необязательно использовать символы '[' и ']' для обозначения каждого элемента, но следует помнить, что, трансформируя массив в строку, нужно соблюсти требование уникальности каждого его элемента. Символы для обрамления следует выбирать с учетом символов, которые допустимы в элементе. Незыблемое правило: каждый элемент массива в строке уникален и имеет свое место (иначе ничего не вернуть обратно).
Этот способ удобнее, когда стоит задача на PHP удалить элемент массива по значению. Можно использовать функцию array_flip и поменять значения и ключи местами, потом сделать классический unset. Можно использовать функцию array_search и найти ключ значения, которое нужно удалить. Но строчный вариант решения нагляднее и проще.
О размерностях и размерах
PHP практически ни в чем не ограничивает разработчика: ни в количестве размерностей, ни в размерах элементов. Смысла увлекаться этим нет. Каждый элемент должен быть минимально возможной длины, а количество размерностей должно стремиться к единице.
Если количество размерностей массива более трех - это веское основание пересмотреть решение. Если элемент массива имеет длину более 4000-8000 символов, должны возникать сомнения в разумности построенной картины данных.
Это мнение вытекает не из контекста функциональности PHP-массива: удалить элемент, добавить объект другого типа, изменить что-то одно на что-то совсем другое. Простота - залог успеха не только в жизни, но и в алгоритме. Программа должна работать, а не удивлять своими размерностями, размерами и масштабами идей. Важен результат, а не грандиозная идея.
Стековая идея на PHP
Как современный язык программирования PHP не проходит мимо рекурсии и стека. Принципиально неважно, что имеет в виду программист, когда использует функцию array_pop() в PHP: удалить последний элемент массива или просто получить его в какую-либо переменную.
Но следует иметь в виду, что в данном контексте функция array_pop - это из сферы push & pop, то есть это инструменты стека, а не удаления.
Здесь принято говорить не «удалить», а «извлечь». Семантика существенно отличается. Однако функция array_shift() в PHP: удалить первый элемент массива или извлечь его - имеет иной оттенок. Здесь также элемент извлекается во внешнюю переменную, и его не будет в массиве, но индексы смещаются.
При извлечении первого элемента из массива все следовавшие за ним элементы смещаются вперед, но изменяются только числовые индексы, строчные остаются неизменными.
Удалить или изменить: история операций
Переменная - это очень давнее прошлое, массив - это уже давно было, объект - это было вчера. Об объектно-ориентированном программировании еще пока только говорят, но ничего не используют в полную силу. Редкий случай, когда поверхностные решения стали предметом восторженных решений и «умудренных» массой «тела» систем управления сайтами (CMS).
Объективное правило: не в количестве кода все дело, а в его качестве! Но никакая современная CMS к этому правилу еще не прислушалась. Ее авторы считают, что они поступают правильно и знают, что делают.
Результат (характерная черта): ни одна из современных CMS не отличается приличной «фигурой» (стройностью и легкостью конструкций), все обладают необъятной полнотой кода, каждая требует к себе уважения:
- высокой квалификации программиста;
- нуждается в инсталляции;
- предъявляет требования к хостингу;
- создает трудности при переезде на другой хостинг;
- реально тормозит в работе и администрировании.
Программисты очень долго шли к понятию отката, современное программирование не мыслит создание программного обеспечения без двух функций:
- undo;
- redo.
Не только человеку свойственно ошибиться, но в любой ситуации откат должен быть. В современных средствах интернет-программирования по сей день этот момент не только не имеет значения, но и применяется в очень ограниченных масштабах.
Операции PHP на массиве: удалить элемент, изменить его тип или добавить что-то новое - понятны. Но раньше были переменные, потом массивы, затем объекты. Разве не повод задуматься о том, что массив - это просто переменная в течение времени?
Массив - это структура данных в течение времени. Ни один язык по сей день не рассматривает время как фактор синтаксиса. Про семантику можно даже не говорить: с древнейших времен по сей день программисты и пользователи понимают только файлы и папки. Максимум до чего дошло развитие, например, на PHP пространство имен (namespace) банально отражается на структуру папок и файлов.
В этом контексте банальные действия в PHP на массиве: удалить элемент, изменить или добавить - требуют от программиста дополнительных действий. Можно все оставить, как есть, и получится, как всегда. Можно учитывать каждую операцию на данных и фиксировать ее в полном объеме, создавать и хранить историю операций.
Это будет совсем другой уровень работы и кардинально лучшее качество результата.