协慌网

登录 贡献 社区

PHP:从数组中删除元素

有没有一种简单的方法可以使用PHP从数组中删除元素,这样foreach ($array)不再包含该元素?

我认为将它设置为null会这样做,但显然它不起作用。

答案

删除数组元素有不同的方法,其中一些对某些特定任务比其他任务更有用。

删除一个数组元素

如果只想删除一个数组元素,可以使用unset()或替代array_splice()

此外,如果您有值并且不知道删除元素的键,则可以使用array_search()来获取密钥。

unset()方法

请注意,使用unset() ,数组键不会更改 / reindex。如果要重新索引键,可以在unset()之后使用array_values() unset() ,它将所有键转换为从 0 开始的数字枚举键。

<?php

    $array = array(0 => "a", 1 => "b", 2 => "c");
    unset($array[1]);
               //↑ Key which you want to delete

?>

产量

Array (
    [0] => a
    [2] => c
)

array_splice()方法

如果使用array_splice() ,键将自动重新编制索引,但关联键不会更改,而array_values()会将所有键转换为数字键。

array_splice()需要偏移量,而不是键!作为第二个参数。

<?php

    $array = array(0 => "a", 1 => "b", 2 => "c");
    array_splice($array, 1, 1);
                       //↑ Offset which you want to delete

?>

产量

Array (
    [0] => a
    [1] => c
)

array_splice()unset() array_splice()相同,通过引用获取数组,这意味着您不希望将这些函数的返回值分配回数组。

删除多个数组元素

如果要删除多个数组元素并且不想多次调用unset()array_splice() ,可以使用函数array_diff()array_diff_key()具体取决于您是否知道元素的值或键。你想删除。

array_diff()方法

如果您知道要删除的数组元素的值,则可以使用array_diff() 。和之前的unset()它不会改变 / 重新索引数组的键。

<?php

    $array = array(0 => "a", 1 => "b", 2 => "c");
    $array = array_diff($array, ["a", "c"]);
                              //└────────┘→ Array values which you want to delete

?>

产量

Array (
    [1] => b
)

array_diff_key()方法

如果您知道要删除的元素的键,则需要使用array_diff_key() 。在这里,您必须确保将键作为键传递到第二个参数而不是值。否则,您必须使用array_flip()翻转数组。而且这里的密钥不会改变 / 重新索引。

<?php

    $array = array(0 => "a", 1 => "b", 2 => "c");
    $array = array_diff_key($array, [0 => "xy", "2" => "xy"]);
                                   //↑           ↑ Array keys which you want to delete
?>

产量

Array (
    [1] => b
)

此外,如果要使用unset()array_splice()删除具有相同值的多个元素,可以使用array_keys()获取特定值的所有键,然后删除所有元素。

应该注意的是, unset()将保持索引不变,这是您在使用字符串索引(数组作为哈希表)时所期望的,但在处理整数索引数组时可能会非常令人惊讶:

$array = array(0, 1, 2, 3);
unset($array[2]);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [3]=>
  int(3)
} */

$array = array(0, 1, 2, 3);
array_splice($array, 2, 1);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(3)
} */

因此,如果您想要规范化整数键,可以使用array_splice() 。另一个选择是在unset()之后使用array_values() unset()

$array = array(0, 1, 2, 3);

unset($array[2]);
$array = array_values($array);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(3)
} */
// our initial array  
   $arr = array("blue", "green", "red", "yellow", "green", "orange", "yellow", "indigo", "red");  
  print_r($arr);

  // remove the elements who's values are yellow or red  
   $arr = array_diff($arr, array("yellow", "red"));
  print_r($arr);

这是上面代码的输出:

Array
(
    [0] => blue
    [1] => green
    [2] => red
    [3] => yellow
    [4] => green
    [5] => orange
    [6] => yellow
    [7] => indigo
    [8] => red
)

Array
(
    [0] => blue
    [1] => green
    [4] => green
    [5] => orange
    [7] => indigo
)

现在,array_values()将很好地重新索引数值数组,但将从数组中删除所有键字符串并用数字替换它们。如果需要保留键名(字符串),或者如果所有键都是数字键,则重新索引数组,使用 array_merge():

$arr = array_merge(array_diff($arr, array("yellow", "red")));
print_r($arr);

输出

Array
(
    [0] => blue
    [1] => green
    [2] => green
    [3] => orange
    [4] => indigo
)