在 PHP 中删除数组中的元素
是否有一种简单的方法可以使用 PHP 从数组中删除元素,使得
foreach ($array)
不再包含该元素?
我以为将其设置为
null
就可以了,但显然不起作用。
删除数组元素有多种方法,有些方法对某些特定任务更有用。
删除单个数组元素
如果只想删除一个数组元素,可以使用
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
]
需要注意的是,
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)
} */
// 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
)