开发者问题收集

在 PHP 中删除数组中的元素

2008-12-15
3790614

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

我以为将其设置为 null 就可以了,但显然不起作用。

3个回答

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

删除单个数组元素

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

按键还是值?

如果知道值但不知道删除元素的键,可以使用 array_search() 来获取键。 这仅在元素出现次数不超过一次时才有效,因为 array_search() 仅返回第一个匹配项。

unset() 表达式

注意:使用 unset() 时,数组键不会改变。 如果您想要重新索引键,可以在 unset() 之后使用 array_values() , 这会将所有键转换为从 0 开始的数字枚举键 (数组仍然是 列表 )。

示例代码:

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

示例输出:

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

array_splice() 函数

如果您使用 array_splice() 中的 (整数) 键将自动重新编入索引, 但关联 (字符串) 键不会改变 — 与 unset() 之后的 array_values() 相反, 这会将所有键转换为数字键。

注意: array_splice() 需要 offset 而不是 key 作为第二个参数; offset = array_flip(array_keys( array ))[ key ] .

示例代码:

$array = [0 => "a", 1 => "b", 2 => "c"];
array_splice($array, 1, 1);
                  // ↑ Offset of element to delete

示例输出:

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

array_splice() ,与 unset() 相同,通过引用获取数组。您无需将返回值重新赋值给数组。

删除多个数组元素

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

array_diff() 函数

如果您知道要删除的数组元素的值,则可以使用 array_diff() 。 与之前使用 unset() 一样,它不会更改数组的键。

示例代码:

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

示例输出:

[
    [1] => b
]

array_diff_key() 函数

如果您知道要删除的元素的键,则需要使用 array_diff_key() 。 您必须确保将键作为第二个参数中的键传递,而不是作为值传递。 键不会重新索引。

示例代码:

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

示例输出:

[
    [1] => b
]

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

array_filter() 函数

如果您想删除数组中具有特定值的所有元素,可以使用 array_filter() .

示例代码:

$array = [0 => "a", 1 => "b", 2 => "c"];
$array = array_filter($array, static function ($element) {
    return $element !== "b";
    //                   ↑
    // Array value which you want to delete
});

示例输出:

[
    [0] => a
    [2] => c
]
2008-12-15

需要注意的是, 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()

$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)
} */
Stefan Gehrig
2008-12-15
  // 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
)
Marcel Cozma
2011-08-02