Массивы в PHP — один из мощнейших инструментов программиста. Когда я начинал изучать PHP, у меня был определенный багаж знаний работы с массивами в других языках программирования, таких как C++, Delphi и Fortrain. Везде требовалось объявить массив, указать его размерность, тип элементов. Ничего похожего вы не встретите в PHP. В PHP массив — это не линейный объект, а хеш-массив, т.е. набор пар — ключей и их значений. При чем, если ключ — это скаляр, то значение может быть любым объектом, в том числе и ещё одном хешем.
Дальше я хочу показать разнообразные способы удаления элементов из хеш-массива в PHP. В языках вроде C++, Delphi для подобных трюков понадобится создать специальный объект, двусвязный или односвязный список, аккуратно выделять и освобождать память, следить за восстановлением связей в списке. В PHP же весь это менеджмент спрятан и всегда готов к использованию.
Как удалить элемент массива в PHP?
Если вы знаете ключ, то удаление сводится к вызову функции unset().
1 2 3 4 5 6 |
<?php $a = array('a','b','c'); unset($a[1]); //удалим элемент с ключем - 1 print_r($a); //увидем на экране : Array ( [0] => a [2] => c ) ?> |
Как удалить первый элемент массива в PHP?
Если вы не знаете ключ, но знаете, что удалить нужно именно первый элемент массива, то можно воспользоваться функцией array_shift(). Функция извлекает значение первого элемента, удаляет его из массива и производит перенумерацию числовых ключей начиная с нуля.
1 2 3 4 5 6 |
<?php $stack = array(3 => 'a', 5 => 'b', 'third element' => 'c'); $elm = array_shift($stack); print_r($stack); //увидим на экране : Array ( [0] => b [third element] => c ) ?> |
В итоге, первый элемент удален, а элемент 5 => ‘b’, попадает под перенумерацию. Элементы со строковыми ключами перенумерацией не затрагиваются.
Как в PHP удалить последний элемент массива?
Похожим образом удаляется последний элемент из массива. В PHP для этого послужит функция array_pop().
1 2 3 4 5 6 |
<?php $stack = array(3 => 'a', 5 => 'b', 'third element' => 'c'); $elm = array_pop($stack); print_r($stack); //увидим на экране : Array ( [3] => a [5] => b ) ?> |
Последний элемент массива удален, перенумерация оставшихся элементов не производится.
Как удалить из массива пустые элементы в PHP?
Разберемся с понятием пустой элемент. Под «пустыми» элементами можно понимать разные скалярные и не скалярные значения. Наиболее полно определение «пустого значения» определяет результат работы функции empty(). Она возвращает true для пустого элемента (не только скалярного). В этом можно убедиться на следующем примере.
1 2 3 4 5 6 7 |
<?php $stack = array(3 => 'a', 5 => 'b', '3rd' => 'c', array(), null, false, 0, '', '0', '00'); foreach ($stack as $k => $v) if (empty($v)) unset($stack[$k]); print_r($stack); //увидим на экране : Array ( [3] => a [5] => b [3rd] => c [12] => 00 ) ?> |
Т.е. мы в цикле проверяем каждый элемент массива функцией empty(), и удаляем пустые. Обратите внимание, что строковый скаляр ‘0’ — тоже считается пустым элементом. А вот ’00’ — уже не является пустым.
Если проверка массива по-элементно кажется вам не оптимальной, то можно воспользоваться функций сравнения массивов — array_diff(), где перечислить все элементы, которые мы считаем «нулевыми».
1 2 3 4 5 6 |
<?php $stack = array(3 => 'a', 5 => 'b', '3rd' => 'c', array(), null, false, 0, '', '0', '00', ' '); $stack = array_diff($stack, array(array(), null, false, 0, '', '0', '00', ' ')); print_r($stack); //увидим на экране : Array ( [3] => a [5] => b [3rd] => c ) ?> |
Этот вариант даже более гибкий, т.к. позволяет задать собственное определение того, что мы считаем пустым элементом.
Как удалить повторяющиеся элементы массива PHP?
Это ещё одна частая задача при работе с массивами. В PHP для её решения есть специальная функция — array_unique(). Посмотрим как она работает.
1 2 3 4 5 6 |
<?php $stack = array('a', 'b', 'b', 'c', 'c', 0, '0'); $stack = array_unique($stack); print_r($stack); //увидим на экране : Array ( [0] => a [1] => b [3] => c [5] => 0 ) ?> |
Видим, что функция удалила из массива повторяющиеся элементы. На самом деле у функции есть ещё один параметр, который указывает как сравнивать элементы.
Значения могут быть следующими:
- SORT_REGULAR — сравнивать без преобразования типа элементов,
- SORT_NUMERIC — сравнивать как числа (т.е. пытаясь преобразовать в число),
- SORT_STRING — сравнивать как строки
- SORT_LOCALE_STRING — сравнивать как строки, учитывая выбранный набор символов (т.н. locale).
По умолчанию используется — SORT_STRING. Выбор типа сравнения имеет огромное значение. Поменяем в предыдущем примере тип на SORT_NUMERIC.
1 2 3 4 5 6 |
<?php $stack = array('a', 'b', 'b', 'c', 'c', 0, '0'); $stack = array_unique($stack, SORT_NUMERIC); print_r($stack); //увидим на экране : Array ( [0] => a ) ?> |
При сравнении все элементы преобразовывались в численному типу скаляра. Что в нашем случае неизменно давало значение ноль. Так у нас остался только первый элемент.
В удалении последнего элемента — присвоение удаляемого элемента переменной не нужно.
Достаточно сделать так:
array_pop($stack);
Действительно, в контексте данной задачи сохранять значение удаляемого элемента не нужно.