有没有一种简单的方法可以使用PHP从数组中删除元素,从而foreach($array)不再包含该元素?
我以为将其设置为null就可以了,但显然它不起作用。
有没有一种简单的方法可以使用PHP从数组中删除元素,从而foreach($array)不再包含该元素?
我以为将其设置为null就可以了,但显然它不起作用。
当前回答
如果您有一个数字索引数组,其中所有值都是唯一的(或者它们是非唯一的,但您希望删除特定值的所有实例),您可以简单地使用array_diff()来删除匹配元素,如下所示:
$my_array = array_diff($my_array, array('Value_to_remove'));
例如:
$my_array = array('Andy', 'Bertha', 'Charles', 'Diana');
echo sizeof($my_array) . "\n";
$my_array = array_diff($my_array, array('Charles'));
echo sizeof($my_array);
这将显示以下内容:
4
3
在本例中,值为“Charles”的元素被移除,这可以通过sizeof()调用进行验证,该调用报告初始数组的大小为4,移除后为3。
其他回答
如果您必须删除数组中的多个值,并且该数组中的条目是对象或结构化数据,那么array_filter()是最佳选择。那些从回调函数返回true的条目将被保留。
$array = [
['x'=>1,'y'=>2,'z'=>3],
['x'=>2,'y'=>4,'z'=>6],
['x'=>3,'y'=>6,'z'=>9]
];
$results = array_filter($array, function($value) {
return $value['x'] > 2;
}); //=> [['x'=>3,'y'=>6,z=>'9']]
$key = array_search($needle, $array);
if ($key !== false) {
unset($array[$key]);
}
// 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
)
删除数组元素有不同的方法,其中一些方法对于某些特定任务比其他方法更有用。
删除单个数组元素
如果只想删除一个数组元素,可以使用unset()或\array_splice()。
如果您知道值,但不知道要删除元素的键,可以使用\array_search()获取键。这只在元素不出现多次时有效,因为\array_search只返回第一次命中。
取消设置()
注意,当您使用unset()时,数组键不会改变。如果要重新索引键,可以在unset()之后使用\array_values(),这会将所有键转换为从0开始的数字枚举键。
代码:
$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
]
如果要使用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
[1] => c
]
<?php
$stack = ["fruit1", "fruit2", "fruit3", "fruit4"];
$fruit = array_shift($stack);
print_r($stack);
echo $fruit;
?>
输出:
[
[0] => fruit2
[1] => fruit3
[2] => fruit4
]
fruit1