有没有一种简单的方法可以使用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),作为第二个参数;偏移量 = 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
可以有多个参数:void unset ( mixed $var [, mixed $... ] )
。 - Константин Ванunset
is not a function but a language construct (and a keyword). It must not and cannot be prefixed with \
- hvertousunset()
函数不会影响到数组的索引值,这在使用字符串作为索引(将数组视为哈希表)时是预期的行为,但在处理整数索引数组时可能会让人感到惊讶。$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)
} */
array_splice
等函数有意义的地方之一。 - Stefan Gehrig // 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
)
array_merge(array_diff(
you saved my time, thanks for both the examples,
1.keys are not re-indexed
and another one with keys are indexed again from 0...n
- Mohammed Sufian$key = array_search($needle, $array);
if ($key !== false) {
unset($array[$key]);
}
unset($array[$index]);
此外,对于一个有名称的元素:
unset($array["elementName"]);
unset()
!如果你想改进那个建议,你应该编辑那个答案。这个多标签页上有太多冗余内容了! - mickmackusa如果你有一个数值索引数组,其中所有的值都是唯一的(或者它们不是唯一的,但你希望删除特定值的所有实例),你可以简单地使用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。删除数组中的单个元素
unset()
$array1 = array('A', 'B', 'C', 'D', 'E');
unset($array1[2]); // Delete known index(2) value from array
var_dump($array1);
输出结果将是:
array(4) {
[0]=>
string(1) "A"
[1]=>
string(1) "B"
[3]=>
string(1) "D"
[4]=>
string(1) "E"
}
如果您需要重新索引数组:
$array1 = array_values($array1);
var_dump($array1);
那么输出结果将会是:
array(4) {
[0]=>
string(1) "A"
[1]=>
string(1) "B"
[2]=>
string(1) "D"
[3]=>
string(1) "E"
}
从数组末尾弹出元素 - 返回被移除元素的值
mixed array_pop(array &$array)
$stack = array("orange", "banana", "apple", "raspberry");
$last_fruit = array_pop($stack);
print_r($stack);
print_r('Last Fruit:'.$last_fruit); // Last element of the array
输出将会是Array
(
[0] => orange
[1] => banana
[2] => apple
)
Last Fruit: raspberry
从数组中删除第一个元素(红色)并返回被删除元素的值
mixed array_shift ( array &$array )
$color = array("a" => "red", "b" => "green" , "c" => "blue");
$first_color = array_shift($color);
print_r ($color);
print_r ('First Color: '.$first_color);
输出结果将为:
Array
(
[b] => green
[c] => blue
)
First Color: red
array_shift
会重新索引键名,如果它是整数,则不好,因此您可以使用此方法:https://dev59.com/pnRC5IYBdhLWcg3wOeWB#52826684 - Nabi K.A.Z.array_shift()
的复杂度是O(n)(由于重新索引数字索引),而array_pop()
的复杂度是O(1)。如何知道第一个元素的索引?只需开始一个foreach
循环,并在第一次迭代中立即使用break
命令。 - AmigoJack<?php
$stack = ["fruit1", "fruit2", "fruit3", "fruit4"];
$fruit = array_shift($stack);
print_r($stack);
echo $fruit;
?>
输出:
[
[0] => fruit2
[1] => fruit3
[2] => fruit4
]
fruit1
array_shift
只能删除数组中的第一个元素。同样地,使用 array_pop
来删除数组中的最后一个元素。 - Jasir$arr = ['a', 'b', 'c'];
$index = 0;
unset($arr[$index]); // $arr = ['b', 'c']
$arr = ['a', 'b', 'c'];
// search the value to find index
// Notice! this will only find the first occurrence of value
$index = array_search('a', $arr);
if($index !== false){
unset($arr[$index]); // $arr = ['b', 'c']
}
unset()
会自动删除数组的第一个元素!!!这不是我们想要的。所以if
条件是必要的。unset()
在多年前的这个页面上已经被多次推荐过了。2011年就有人演示了使用array_search()
和unset()
的方法。https://dev59.com/pnRC5IYBdhLWcg3wOeWB#8135667 这个答案没有为这个页面增加任何新价值。 - mickmackusa
unset()
后,数组的迭代将不再包括已移除的值。另一方面,Stevan的回答很充分,实际上,这就是我正在寻找的答案 - 但不是该帖子的原始问题 :) Konrad的回答是最简单的解决所提出问题的方法。使用unset()
函数之后,数组的迭代将不再包括已删除的值。然而,Stevan的回答更加详尽,并且事实上,那正是我一开始寻找的答案 - 但并非该帖作者想要的答案 :) - brandizzi