从 PHP 中的数组中删除元素

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

我认为将其设置为null可以做到,但是显然不起作用。

答案

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

删除一个数组元素

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

另外,如果您具有该值并且不知道要删除元素的键,则可以使用\array_search()获取键。

unset()

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

<?php

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

?>

输出量

[
    [0] => a
    [2] => c
]

\array_splice()方法

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

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

<?php

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

?>

输出量

[
    [0] => a
    [1] => c
]

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

删除多个数组元素

如果要删除多个数组元素并且不想多次调用unset()\array_splice() ,则可以根据您是否知道其中的值或键来使用函数\array_diff()\array_diff_key() 。您要删除的元素。

\array_diff()方法

如果知道要删除的数组元素的值,则可以使用\array_diff() 。与以前一样,使用unset()不会更改 / 重新索引数组的键。

<?php

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

?>

输出量

[
    [1] => b
]

\array_diff_key()方法

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

<?php

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

输出量

[
    [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
)
$key = array_search($needle, $array);
if ($key !== false) {
    unset($array[$key]);
}
unset($array[$index]);

如果您有一个数字索引的数组,其中所有值都是唯一的(或者它们是非唯一的,但是您希望删除特定值的所有实例),则可以简单地使用 array_diff()删除匹配的元素,如下所示:

$my_array = array_diff($my_array, array('Value_to_remove'));

例如:

$my_array = array('Andy', 'Bertha', 'Charles', 'Diana');
echo sizeof($my_array) . "\n";
$my_array = array_diff($my_array, array('Charles'));
echo sizeof($my_array);

显示以下内容:

4
3

在此示例中,值 “Charles” 的元素被删除,可以通过 sizeof()调用进行验证,该调用报告初始数组的大小为 4,删除后的大小为 3。

另外,对于命名元素:

unset($array["elementName"]);
<?php
    $stack = ["fruit1", "fruit2", "fruit3", "fruit4"];
    $fruit = array_shift($stack);
    print_r($stack);

    echo $fruit;
?>

输出:

[
    [0] => fruit2
    [1] => fruit3
    [2] => fruit4
]

fruit1

销毁数组的单个元素

unset()

$array1 = array('A', 'B', 'C', 'D', 'E');
unset($array1[2]); // Delete known index(2) value from array
var_dump($array1);

输出将是:

array(4) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [3]=>
  string(1) "D"
  [4]=>
  string(1) "E"
}

如果需要重新索引数组:

$array1 = array_values($array1);
var_dump($array1);

然后输出将是:

array(4) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "D"
  [3]=>
  string(1) "E"
}

从数组末尾弹出元素 - 返回已删除元素的值

mixed array_pop(array &$array)

$stack = array("orange", "banana", "apple", "raspberry");
$last_fruit = array_pop($stack);
print_r($stack);
print_r('Last Fruit:'.$last_fruit); // Last element of the array

输出将是

Array
(
    [0] => orange
    [1] => banana
    [2] => apple
)
Last Fruit: raspberry

从数组中删除第一个元素(红色) ,- 返回已删除元素的值

mixed array_shift ( array &$array )

$color = array("a" => "red", "b" => "green" , "c" => "blue");
$first_color = array_shift($color);
print_r ($color);
print_r ('First Color: '.$first_color);

输出将是:

Array
(
    [b] => green
    [c] => blue
)
First Color: red

为了避免进行搜索,可以使用array_diff

$array = array(3, 9, 11, 20);
$array = array_diff($array, array(11) ); // removes 11

在这种情况下,不必搜索 / 使用密钥。