问:
有没有简便的方法可以从php数组中删除元素,使用 foreach ($array)
也不会遍历到被删的元素?
我原以为将元素的值设为null可以,但事实显然并非如此.
答:
删除一个数组元素有多个方法,有的方法在一些特殊的情况下会比其他的方法更有用.
删除一个数组元素
如果你仅仅想删除一个数组元素,你可以交替使用 unset()
或 array_splice()
.
如果你想删除一个数组元素但只知道他的 value 而不知道 key ,你可以使用 array_search()
去获得key.
unset()
方法
需知使用unset()
后,数组不会重建索引.如果你想要重建索引可以在 unset()
之后使用 array_values()
此函数将把所有的key转变成从0开始的数字的枚举类型.
<?php
$array = array(0 => "a", 1 => "b", 2 => "c");
unset($array[1]);
//↑ 你想要删除元素的key
?>
输出:
Array (
[0] => a
[2] => c
)
array_splice()
方法
如果你使用 array_splice()
方法, key 的索引将会被自动重建, 但组合的key(associative keys)不会被改变,相反 array_values()
方法会将所有的key转变成枚举的数字型key.
array_splice()
需要偏移量作为第二个参数,而不是key.
代码:
<?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()
一样通过引用来操作数组, 这意味着你不想指定返回值this means you don't want to assign the return values of those functions back to the array.
删除多个数组元素
如果你想删除多个数组元素,且不多次调用 unset()
或 array_splice()
.在知道元素的value或key的情况下可以分别使用 array_diff()
或 array_diff_key()
方法.
array_diff()
方法
在知道欲删除元素的value时当使用此方法,使用后不重置数组索引.
代码:
<?php
$array = array(0 => "a", 1 => "b", 2 => "c");
$array = array_diff($array, ["a", "c"]);
//└────────┘→ 要删除元素的value
?>
输出:
Array (
[1] => b
)
array_diff_key()
方法
在知道欲删除元素的key时当使用此方法,使用后也不重置数组索引.请确保在第二个参数传入的是欲删除元素的key. 否则必须使用array_flip()
来反转数组.
代码:
<?php $array = array(0 => "a", 1 => "b", 2 => "c"); $array = array_diff_key($array, [0 => "xy", "2" => "xy"]); //↑ ↑
要删除元素的key
?>
输出:
Array (
[1] => b
)
如果你想用 unset()
或 array_splice()
删除具有相同value的多个元素你可以使用 array_keys()
来获取那个特殊value的所有key.