有没有一种简单的方法可以用PHP从数组中删除一个元素,使foreach ($array)
不再包括该元素?
我以为把它设置为 "null "就可以了,但很明显,这并不奏效。
有不同的方法来删除一个数组元素,其中有些方法对某些特定的任务比其他方法更有用。
如果你想只删除一个数组元素,你可以使用 unset()
或者 array_splice()
。
另外,如果你有值,但不知道删除元素的键,你可以使用 \array_search()
来获得键。
unset()
方法注意,当你使用unset()
时,数组的键不会改变/重新索引。如果你想重新索引这些键,你可以在unset()
之后使用\array_values()
,这将把所有的键转换为从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()
。另一个选择是在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)
} */