Каков наилучший способ удалить элемент массива в PHP? - PullRequest
10 голосов
/ 17 ноября 2009

Не могли бы вы рассказать мне, как удалить элемент из массива? Как вы думаете, это хорошо?

Ответы [ 3 ]

10 голосов
/ 17 ноября 2009

Это зависит от:

$a1 = array('a' => 1, 'b' => 2, 'c' => 3);
unset($a1['b']);
// array('a' => 1, 'c' => 3)

$a2 = array(1, 2, 3);
unset($a2[1]);
// array(0 => 1, 2 => 3)
// note the missing index 1

// solution 1 for numeric arrays
$a3 = array(1, 2, 3);
array_splice($a3, 1, 1);
// array(0 => 1, 1 => 3)
// index is now continous

// solution 2 for numeric arrays
$a4 = array(1, 2, 3);
unset($a4[1]);
$a4 = array_values($a4);
// array(0 => 1, 1 => 3)
// index is now continous

Обычно unset() безопасен для хеш-таблиц (массивы с индексами строк), но если вам приходится полагаться на непрерывные числовые индексы, вам придется использовать либо array_splice() или комбинация unset() и array_values().

10 голосов
/ 17 ноября 2009

Общий способ:

Согласно инструкции

unset($arr[5]); // This removes the element from the array

Отфильтрованный путь:

Существует также функция array_filter () , чтобы заботиться о фильтрации массивов

$numeric_data = array_filter($data, "is_numeric");

Для получения последовательного индекса вы можете использовать

$numeric_data = array_values($numeric_data);

Ссылки
PHP - Удалить выбранные элементы из массива

6 голосов
/ 17 ноября 2009

Это зависит. Если вы хотите удалить элемент, не вызывая пробелов в индексах, вам нужно использовать array_splice:

$a = array('a','b','c', 'd');
array_splice($a, 2, 1);
var_dump($a);

Выход:

array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "d"
}

Использование unset может работать, но это приводит к непостоянному индексу. Иногда это может быть проблемой, когда вы выполняете итерацию по массиву, используя count ($ a) - 1 в качестве меры верхней границы:

$a = array('a','b','c', 'd');
unset($a[2]);
var_dump($a);

Выход:

array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [3]=>
  string(1) "d"
}

Как видите, счетчик теперь равен 3, но индекс последнего элемента также равен 3.

Поэтому я рекомендую использовать array_splice для массивов с числовыми индексами и использовать unset только для массивов (действительно словарей) с нечисловыми индексами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...