有没有一种简便的方法可以使用PHP从数组中删除元素,从而foreach ($array)
不再包含该元素?
我以为将它设置为null
可以实现,但是显然不起作用。
我不会认为Konrad的答案是上述问题最简单的答案。随着unset()
数组的迭代,将不再包含移除的值。OTOH,确实Stevan的答案很充分,实际上,这是我一直在寻找的答案-但不是OP :)
有多种删除数组元素的方法,其中某些方法对某些特定任务比其他任务更有用。
如果只想删除一个数组元素,则可以使用unset()
或\array_splice()
。
另外,如果您具有值并且不知道要删除元素的键,则可以使用\array_search()
该键来获取键。
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()
通过引用获取数组一样,这意味着您不想将这些函数的返回值分配回数组。
如果你想删除多个数组元素,不想打电话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_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()
如果您想标准化整数键,可以使用它。另一种选择是array_values()
在after之后使用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)} */