有没有一种简单的方法可以使用PHP从数组中删除元素,使得foreach($array)
不再包括该元素?
我曾认为将其设置为null
会起作用,但显然这并不起作用。
虽然 unset()
已经被提到了多次,但还没有提到 unset()
可以接受多个变量,这使得一次性删除数组中多个非连续元素变得容易:
// Delete multiple, noncontiguous elements from an array
$array = [ 'foo', 'bar', 'baz', 'quz' ];
unset( $array[2], $array[3] );
print_r($array);
// Output: [ 'foo', 'bar' ]
unset()函数不接受一个要删除的键的数组,因此下面的代码将失败(尽管这会使动态使用unset()函数变得稍微容易一些)。
$array = range(0,5);
$remove = [1,2];
$array = unset( $remove ); // FAILS: "unexpected 'unset'"
print_r($array);
相反,可以在foreach循环中动态使用unset():
$array = range(0,5);
$remove = [1,2];
foreach ($remove as $k=>$v) {
unset($array[$v]);
}
print_r($array);
// Output: [ 0, 3, 4, 5 ]
还有一种方法尚未提到。有时,摆脱特定的数组键最简单的方法是将 $array1 简单复制到 $array2 中。
$array1 = range(1,10);
foreach ($array1 as $v) {
// Remove all even integers from the array
if( $v % 2 ) {
$array2[] = $v;
}
}
print_r($array2);
// Output: [ 1, 3, 5, 7, 9 ];
$array1 = [ 'foo', '_bar', 'baz' ];
foreach ($array1 as $v) {
// Remove all strings beginning with underscore
if( strpos($v,'_')===false ) {
$array2[] = $v;
}
}
print_r($array2);
// Output: [ 'foo', 'baz' ]
使用 unset
函数,如下所示:
$a = array(
'salam',
'10',
1
);
unset($a[1]);
print_r($a);
/*
Output:
Array
(
[0] => salam
[2] => 1
)
*/
使用array_search
函数获取元素键,并按照上述方式删除数组元素,代码如下:
$a = array(
'salam',
'10',
1
);
$key = array_search(10, $a);
if ($key !== false) {
unset($a[$key]);
}
print_r($a);
/*
Output:
Array
(
[0] => salam
[2] => 1
)
*/
unset()
和 array_search()
与 unset()
的结合已经在2017年发布过了。这个答案只提供了多余的见解。 - mickmackusa<?php
// If you want to remove a particular array element use this method
$my_array = array("key1"=>"value 1", "key2"=>"value 2", "key3"=>"value 3");
print_r($my_array);
if (array_key_exists("key1", $my_array)) {
unset($my_array['key1']);
print_r($my_array);
}
else {
echo "Key does not exist";
}
?>
<?php
//To remove first array element
$my_array = array("key1"=>"value 1", "key2"=>"value 2", "key3"=>"value 3");
print_r($my_array);
$new_array = array_slice($my_array, 1);
print_r($new_array);
?>
<?php
echo "<br/> ";
// To remove first array element to length
// starts from first and remove two element
$my_array = array("key1"=>"value 1", "key2"=>"value 2", "key3"=>"value 3");
print_r($my_array);
$new_array = array_slice($my_array, 1, 2);
print_r($new_array);
?>
输出
Array ( [key1] => value 1 [key2] => value 2 [key3] =>
value 3 ) Array ( [key2] => value 2 [key3] => value 3 )
Array ( [key1] => value 1 [key2] => value 2 [key3] => value 3 )
Array ( [key2] => value 2 [key3] => value 3 )
Array ( [key1] => value 1 [key2] => value 2 [key3] => value 3 )
Array ( [key2] => value 2 [key3] => value 3 )
unset()
之前检查键是否存在并没有什么好处。如果在数组中找不到该键,则unset()
将静默地不执行任何操作(正如预期的那样)。在此答案发布之前,已经推荐使用unset()
和array_slice()
。此答案未为此页面添加任何新价值。 - mickmackusa$arr = array('orange', 'banana', 'apple', 'raspberry');
$result = array_pop($arr);
print_r($result);
array_pop($arr)
就可以删除数组的最后一个元素,不需要添加=
。 - Krista K我来这里是想看看是否有比使用unset($arr[$i])更优雅的解决方案。令我失望的是,这些答案要么是错误的,要么没有涵盖每个边缘情况。
以下是array_diff()无法工作的原因。数组中的键是唯一的,而元素并不总是唯一的。
$arr = [1,2,2,3];
foreach($arr as $i => $n){
$b = array_diff($arr,[$n]);
echo "\n".json_encode($b);
}
结果...
[2,2,3]
[1,3]
[1,2,2]
$arr = [1,2,3];
foreach($arr as $i => $n){
$b = array_merge(array_slice($arr,0,$i),array_slice($arr,$i+1));
echo "\n".json_encode($b);
}
Results...
[2,3];
[1,3];
[1,2];
由于unset($arr[$i])可用于关联数组和数字数组,因此这仍然无法回答问题。
这个解决方案是通过比较键来实现的,并使用一个可以处理数字和关联数组的工具。我使用array_diff_uassoc()函数来完成。该函数在回调函数中比较键。
$arr = [1,2,2,3];
//$arr = ['a'=>'z','b'=>'y','c'=>'x','d'=>'w'];
foreach($arr as $key => $n){
$b = array_diff_uassoc($arr, [$key=>$n], function($a,$b) {
if($a != $b){
return 1;
}
});
echo "\n".json_encode($b);
}
结果……
[2,2,3];
[1,2,3];
[1,2,2];
['b'=>'y','c'=>'x','d'=>'w'];
['a'=>'z','c'=>'x','d'=>'w'];
['a'=>'z','b'=>'y','d'=>'w'];
['a'=>'z','b'=>'y','c'=>'x'];
foreach
循环中不再包含它,你可以使用几种方法。下面是一个直接的方法:unset()
$myArray = ['apple', 'banana', 'cherry'];
unset($myArray[1]); // 删除 'banana'
array_splice()
函数
$myArray = ['apple', 'banana', 'cherry'];
array_splice($myArray, 1, 1); // 删除 'banana'
array_diff()
函数。
用途:适用于根据值删除元素。不影响键。
示例:
$myArray = ['apple', 'banana', 'cherry'];
$myArray = array_diff($myArray, ['banana']); // 删除 'banana'
array_filter()
函数。$myArray = ['apple', 'banana', 'cherry'];
$myArray = array_filter($myArray, function($item) {
return $item !== 'banana';
});
unset()
后,数组的迭代将不再包括已移除的值。另一方面,Stevan的回答很充分,实际上,这就是我正在寻找的答案 - 但不是该帖子的原始问题 :) Konrad的回答是最简单的解决所提出问题的方法。使用unset()
函数之后,数组的迭代将不再包括已删除的值。然而,Stevan的回答更加详尽,并且事实上,那正是我一开始寻找的答案 - 但并非该帖作者想要的答案 :) - brandizzi