PHP: 如何从数组中删除特定元素?

196

当我知道数组中某个元素的值时,如何从数组中删除该元素?例如:

我有一个数组:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

用户输入strawberry

$array中删除strawberry

完整解释:

我有一个数据库,它存储以逗号分隔的项目列表。代码基于用户选择的位置来提取列表。例如,如果他们选择了草莓,代码会提取出每个包含草莓的条目,然后使用split()将其转换为数组。我想要从数组中删除用户选择的物品(本例中为草莓)。


4
同样的问题:https://dev59.com/EGw05IYBdhLWcg3weBpF - trante
1
另一个相同的问题:https://dev59.com/WHI-5IYBdhLWcg3wYnSQ - Eric Lavoie
1
更多相同的问题:https://dev59.com/pnRC5IYBdhLWcg3wOeWB - Alex
22个回答

2
我目前正在使用这个函数:
function array_delete($del_val, $array) {
    if(is_array($del_val)) {
         foreach ($del_val as $del_key => $del_value) {
            foreach ($array as $key => $value){
                if ($value == $del_value) {
                    unset($array[$key]);
                }
            }
        }
    } else {
        foreach ($array as $key => $value){
            if ($value == $del_val) {
                unset($array[$key]);
            }
        }
    }
    return array_values($array);
}

你可以输入一个数组或仅包含需要被移除元素的字符串。 写成这样:
$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$detils = array_delete(array('orange', 'apple'), $detils);

$details = array_delete('orange', $details);

这也会重新索引它。


2
这太复杂和混乱了。这怎么得到了3个赞?! - mickmackusa

1

这个问题的答案是 PHP按值删除数组(而不是键),由https://stackoverflow.com/users/924109/rok-kralj提供。

我认为这是最好的答案,因为它可以删除而不会改变原数组。

array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]

它具有很好的普适性,您可以同时删除任意数量的元素,如果需要的话。

免责声明:请注意,我的解决方案生成一个数组的新副本,同时保持旧副本不变,与被接受的答案相反,后者会进行突变。因此,由于这个原因,速度可能会稍微慢一些。


1
一个更好的方法可能是将您的值作为关联数组中的键,并在需要实际数组时调用array_keys()。这样,您就不需要使用array_search来查找元素。

1
你的帖子是评论而不是答案。请删除并在问题本身下发布。 - mickmackusa

1
我正在寻找与此相同问题的答案,并遇到了这个话题。我看到两种主要方法:组合使用array_searchunset以及使用array_diff。乍一看,第一种方法似乎会更快,因为它不需要创建一个额外的数组(就像使用array_diff时一样)。但是我写了一个小基准测试,并确信第二种方法不仅更简洁,而且更快!很高兴与您分享这个。 :)

https://glot.io/snippets/f6ow6biaol


0

创建数字数组并删除特定的数组值

    <?php
    // create a "numeric" array
    $animals = array('monitor', 'cpu', 'mouse', 'ram', 'wifi', 'usb', 'pendrive');

    //Normarl display
    print_r($animals);
    echo "<br/><br/>";

    //If splice the array
    //array_splice($animals, 2, 2);
    unset($animals[3]); // you can unset the particular value
    print_r($animals);

    ?>

您可以参考此链接..


Downvote。问题明确要求根据值(而不是键)删除一个值。这个回答是无用的,请删除。 - mickmackusa

0

我更喜欢使用 array_key_exists 在数组中搜索键,例如:

Array([0]=>'A',[1]=>'B',['key'=>'value'])

这样可以有效地找到指定的键,因为 array_search 和 in_array() 在这里不起作用。然后使用 unset() 删除内容。

我认为这会对某些人有所帮助。


0
$remove= "strawberry";
$array = ["apple", "orange", "strawberry", "blueberry", "kiwi"];
foreach ($array as $key => $value) {
        if ($value!=$remove) {
        echo $value.'<br/>';
                continue;
        }
}

这个答案甚至没有移除所需的选项。 - Nigel Ren

-1
unset($array[array_search('strawberry', $array)]);

3
下投票。 John Conde 已经在几年前发布了 array_search()-unset() 方法,与你提供的方法类似,重复的答案对读者没有价值,实际上会造成不便,因为读者要在滚动和阅读冗余信息中浪费时间。请删除这个答案。 - mickmackusa

-1

使用array_search(),请尝试以下操作:

if(($key = array_search($del_val, $messages)) !== false) {
    unset($messages[$key]);
}

array_search() 函数返回它找到的元素的键,可以使用 unset() 从原始数组中删除该元素。如果失败,它将返回 FALSE,但是在成功时它可以返回一个“falsey”值(例如,您的键可能为 0),这就是为什么使用严格比较运算符 !==

if() 语句将检查 array_search() 是否返回了一个值,并且只有在返回值时才执行操作。


3
Downvote。这是Gumbo方法的重复回答(目前被接受的解决方案),而他的方法早在你之前几年就已经发布了。重复的回答没有价值,只会导致页面不必要的膨胀。请删除你的回答。如果你想解释Gumbo的答案,请在他的答案上进行编辑或要求Gumbo扩展他自己的答案。 - mickmackusa

-1
<?php 
$array = array("apple", "orange", "strawberry", "blueberry", "kiwi");
$delete = "strawberry";
$index = array_search($delete, $array);
array_splice($array, $index, 1);
var_dump($array);
?>

2
你可以通过写一两句话来改进这个答案,解释a) 代码的作用是什么,b) 为什么你认为它是所有其他答案中的一个选项。 - Robin Mackenzie

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