从 PHP 中的数组中删除元素

2022-08-30 05:43:47

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

我以为设置它会做到这一点,但显然它不起作用。null


答案 1

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

删除单个数组元素

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

如果您知道该值,但不知道删除该元素的键,则可以使用 \array_search() 来获取该键。仅当元素不出现多次时,这才有效,因为仅返回第一个命中。\array_search

unset()

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

法典:

$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()需要偏移量,而不是,作为第二个参数。

法典:

$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()

删除多个数组元素

如果要删除多个数组元素,并且不想调用或多次调用,则可以使用这些函数,或者根据您是否知道要删除的元素的值或键。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 which you want 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 which you want to delete

输出:

[
    [1] => b
]

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

\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
    [1] => c
]

答案 2

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

$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)
} */