在PHP中删除数组中的一个元素

3051

有没有一种简单的方法可以使用PHP从数组中删除元素,使得foreach($array)不再包括该元素?

我曾认为将其设置为null会起作用,但显然这并不起作用。


17
我希望你能翻译以下内容:Konrad的回答是针对所述问题最简单的。使用unset()后,数组的迭代将不再包括已移除的值。另一方面,Stevan的回答很充分,实际上,这就是我正在寻找的答案 - 但不是该帖子的原始问题 :) Konrad的回答是最简单的解决所提出问题的方法。使用unset()函数之后,数组的迭代将不再包括已删除的值。然而,Stevan的回答更加详尽,并且事实上,那正是我一开始寻找的答案 - 但并非该帖作者想要的答案 :) - brandizzi
48
在手册中容易找到并不意味着问题不能在StackOverflow上提问。如果问题是StackOverflow的重复问题,则可能不适合在这里提问。StackOverflow是一个很好的去处,甚至在查看手册之前就可以寻找答案。 - Dan Nissenbaum
7
@unset($array[$key]); $array = array_values($array);翻译:移除数组中键为$key的元素;将数组重新索引,使其键从0开始。 - trojan
2
如果您想从数组的数组(关联数组)中删除键,请参见以下解决方案:https://dev59.com/DHI-5IYBdhLWcg3wQV4Z#47978980 - Somnath Muluk
3
将数组键值设置为null意味着包含具有null值的键。该键仍然存在。 - blakroku
显示剩余2条评论
26个回答

8

从数组中删除多个、非连续元素

虽然 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()函数不接受一个要删除的键的数组,因此下面的代码将失败(尽管这会使动态使用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' ]

7

根据键名删除数组元素:

使用 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
        )

*/

1
unset()array_search()unset() 的结合已经在2017年发布过了。这个答案只提供了多余的见解。 - mickmackusa

7
<?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

6
请使用以下代码:
$arr = array('orange', 'banana', 'apple', 'raspberry');
$result = array_pop($arr);
print_r($result);

5
在PHP5中,简单地运行array_pop($arr)就可以删除数组的最后一个元素,不需要添加= - Krista K

2

我来这里是想看看是否有比使用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] 

如果两个元素相同,则它们将被删除。这也适用于array_search()和array_flip()。
我看到了很多使用array_slice()和array_splice()的答案,但这些函数仅适用于数字数组。我知道的所有答案都没有回答问题,所以这里是一个可行的解决方案。
$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'];

0
从PHP数组中删除一个元素,以便在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';
});

每种方法都有其特定的用例和对数组结构的影响,特别是关于键。选择最适合您需求的方法。
如果您想了解更全面的关于PHP中数组操作的见解和高级示例,您可能会发现this article有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接