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

Posted

技术标签:

【中文标题】PHP:如何从数组中删除特定元素?【英文标题】:PHP: How to remove specific element from an array? 【发布时间】:2011-01-27 18:48:44 【问题描述】:

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

我有一个数组:

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

用户输入strawberry

strawberry 已从 $array 中删除。

全面解释:

我有一个数据库,其中存储了一个以逗号分隔的项目列表。代码根据用户选择所在的选项拉入列表。因此,如果他们选择草莓,他们的代码会在每个条目中提取草莓,然后使用 split() 将其转换为数组。我想让他们从数组中删除用户选择的项目,例如草莓。

【问题讨论】:

同样的问题:***.com/questions/7225070/… 另一个同样的问题:***.com/questions/1883421/… 更多相同问题:***.com/questions/369602/… 【参考方案1】:

你可以试试这个

<?php

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

$key = in_array("strawberry",$array);

if ($key) 
  
    unset($array[$key]);
    


?>

【讨论】:

这不起作用,因为 in_array 返回布尔值而不是针的索引。【参考方案2】:

使用这个简单的方法希望它会有所帮助

foreach($array as $k => $value)
    
      
        if($value == 'strawberry')
        
          unset($array[$k]);
        
    

【讨论】:

【参考方案3】:
foreach ($get_dept as $key5 => $dept_value) 
                if ($request->role_id == 5 || $request->role_id == 6)
                    array_splice($get_dept, $key5, 1);
                
            

【讨论】:

除了您提供的答案之外,请考虑提供一个简短说明,说明为什么以及如何解决此问题。【参考方案4】:

你可以做单行。它将从数组中删除元素


$array=array_diff($array,['strawberry']);


【讨论】:

这应该是公认的答案,因为未设置会在数组中留下一个“洞”。 也许可以,但代码应该很简单……亲吻原则【参考方案5】:

您可以使用数组过滤器通过$v上的特定条件删除项目:

$arr = array_filter($arr, function($v)
    return $v != 'some_value';
);

【讨论】:

投反对票。这种低质量(因为它是一个纯代码答案并给出解析错误)是 D.Martin 方法的副本,该方法仅在 array_filter() 中使用匿名函数。虽然我个人会在我的实现中使用匿名函数,但我相信对 SO 的正确操作是评论或编辑 D.Martin 的答案,如果您希望进行微改进,以便此页面不会变得臃肿。请删除这个重复的答案。【参考方案6】:

使用array_diff() 1 行解决方案:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi', 'strawberry'); //throw in another 'strawberry' to demonstrate that it removes multiple instances of the string
$array_without_strawberries = array_diff($array, array('strawberry'));
print_r($array_without_strawberries);

...不需要额外的函数或 foreach 循环。

【讨论】:

这个解决方案比***解决方案更清晰。 虽然如果strawberry不在初始数组中,它会在$array_without_strawberries数组中可用——如果你想确保给定的元素不在数组中,这是危险的代码。跨度> @Erfan 你的说法是错误的。 $a = array_diff(array(), array('strawberry')); - $a 是一个空数组。 你说得对@bancer - 我可能在想array_intersect 什么的。 array_diff() 比标记的答案更优雅。【参考方案7】:

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

https://glot.io/snippets/f6ow6biaol

【讨论】:

【参考方案8】:

这个问题有几个答案,但我想添加更多内容,因为当我使用 unsetarray_diff 时,当删除特定元素时,我在处理新数组的索引时遇到了几个问题(因为初始索引已保存)

我回到例子:

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

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[array_search('strawberry', $array)]);

如果您打印结果,您将获得:

foreach ($array_without_strawberries as $data) 
   print_r($data);

结果:

> apple
> orange
> blueberry
> kiwi

但索引将被保存,因此您将访问您的元素,例如:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[3] > blueberry
$array_without_strawberries[4] > kiwi

因此最终的数组不会被重新索引。所以需要在unset或者array_diff后面加上:

$array_without_strawberries = array_values($array);

之后你的数组将有一个正常的索引:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[2] > blueberry
$array_without_strawberries[3] > kiwi

与此帖相关:Re-Index Array

希望对你有帮助

【讨论】:

【参考方案9】:

如果您在此处使用普通数组(似乎是这种情况),则应该改用以下代码:

if (($key = array_search('strawberry', $array)) !== false) 
    array_splice($array, $key, 1);

unset($array[$key]) 仅删除元素,但不重新排序普通数组。

假设我们有一个数组并使用array_splice:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
array_splice($array, 2, 1);
json_encode($array); 
// yields the array ['apple', 'orange', 'blueberry', 'kiwi']

与未设置相比:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[2]);
json_encode($array);
// yields an object "0": "apple", "1": "orange", "3": "blueberry", "4": "kiwi"

注意unset($array[$key]) 不会重新排列数组。

【讨论】:

官方unset不返回任何东西。所以json_encode(unset($array[2])) 不适合做比较。 这正是我所需要的,感谢 ericluwj【参考方案10】:
<?php 
$array = array("apple", "orange", "strawberry", "blueberry", "kiwi");
$delete = "strawberry";
$index = array_search($delete, $array);
array_splice($array, $index, 1);
var_dump($array);
?>

【讨论】:

你可以写一两句话来改进这个答案:a)代码的作用,b)为什么你认为它是所有其他答案中的一个选项。【参考方案11】:
$remove= "strawberry";
$array = ["apple", "orange", "strawberry", "blueberry", "kiwi"];
foreach ($array as $key => $value) 
        if ($value!=$remove) 
        echo $value.'<br/>';
                continue;
        

【讨论】:

这个答案甚至没有删除所需的选项。【参考方案12】:

PHP array delete by value (not key)的答案 由 https://***.com/users/924109/rok-kralj

IMO 是最好的答案,因为它会移除且不会变异

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

它很好地概括了,如果你愿意,你可以同时删除尽可能多的元素。

免责声明:请注意,我的解决方案会生成数组的新副本,同时保持旧副本完好无损,而接受的答案会发生变异。因此,它可能会慢一些。

【讨论】:

【参考方案13】:

更好的方法可能是将您的值作为键保留在关联数组中,然后在您想要实际数组时调用array_keys()。这样您就无需使用array_search 来查找您的元素。

【讨论】:

您的帖子是评论而不是答案。请删除并在问题本身下发布。【参考方案14】:

使用删除特定数组值创建数值数组

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

    ?>

You Can Refer this link..

【讨论】:

投反对票。该问题明确要求根据值(而不是键)删除值。此答案无用,请删除。【参考方案15】:

这是一个简单的重复,可以删除数组中的多个值。

    // Your array
    $list = array("apple", "orange", "strawberry", "lemon", "banana");

    // Initilize what to delete
    $delete_val = array("orange", "lemon", "banana");

    // Search for the array key and unset   
    foreach($delete_val as $key)
        $keyToDelete = array_search($key, $list);
        unset($list[$keyToDelete]);
    

【讨论】:

这是 PHP 开发人员已经在 array_diff() 中创建的低效、自制的替代品。这是如何获得三个赞成票的。没有人应该发现这个答案有帮助或在他们自己的项目中使用它。我建议删除此答案 - 这将使您的帐户免于低质量答案,减少此页面上的答案膨胀,并为您赢得纪律徽章。我将推迟我的反对票,以便您有时间删除以获得奖励。【参考方案16】:

我目前正在使用这个功能:

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);

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

它还会重新索引它。

【讨论】:

这是非常复杂和循环的。这是如何获得 3 票的?!?【参考方案17】:
$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
     function remove_embpty($values)
     
        if($values=='orange')
        
            $values='any name';
        
        return $values;
     
     $detils=array_map('remove_embpty',$detils);
    print_r($detils);

【讨论】:

请补充说明。它是如何解决问题的。 您的答案将数组的一个元素替换为另一个 NO 以删除一个元素 投反对票。这个答案没有提供预期的输出。请删除此错误答案。【参考方案18】:

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

Array([0]=&gt;'A',[1]=&gt;'B',['key'=&gt;'value'])

要有效地找到指定的,因为 array_search 和 in_array() 在这里不起作用。并使用 unset() 删除内容。

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

【讨论】:

【参考方案19】:
if (in_array('strawberry', $array)) 

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

【讨论】:

你应该测试 strawberry 是否在数组中。 按照 Gumbo 的建议修改了答案,包括在从数组中删除元素之前对其进行验证。 另外请记住,删除特定元素后索引不会重新对齐。换句话说,索引序列将有​​间隙。如果您从示例中删除“草莓”,“猕猴桃”仍将具有索引 4,而索引 2 将简单地消失。如果您的代码依赖于索引序列的完整性,这很重要,例如 for($i = 0; $i <..> 添加到香蕉王所说的,如果你想重新索引数组,只需执行$my_array = array_values($my_array); 虽然此解决方案是正确的,但它会搜索数组 TWICE(in_arrayarray_search)。在 Gumbo 的回答中使用 array_search 的返回更有效【参考方案20】:
unset($array[array_search('strawberry', $array)]);

【讨论】:

投反对票。 array_search()-unset() 方法早在你之前就已经由 John Conde 发布了。重复的答案对读者没有价值,实际上是一种不便,因为在滚动和阅读冗余信息时会浪费时间。请删除此答案。【参考方案21】:

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

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

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

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

【讨论】:

投反对票。这是 Gumbo 方法(目前是公认的解决方案)的副本,该方法比您早几年发布。重复的答案没有价值,只会导致不必要的页面膨胀。请删除您的答案。如果您想解释 Gumbo 的答案,请编辑他的答案或让 Gumbo 扩展他自己的答案。【参考方案22】:

会是这样的:

 function rmv_val($var)
 
     return(!($var == 'strawberry'));
 

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

 $array_res = array_filter($array, "rmv_val");

【讨论】:

【参考方案23】:

使用array_search 获取密钥并使用unset 删除它(如果找到):

if (($key = array_search('strawberry', $array)) !== false) 
    unset($array[$key]);

如果没有找到任何项目,

array_search 返回 falsenull 直到 PHP 4.2.0)。

如果可以有多个item具有相同的值,可以使用array_keys获取所有item的key:

foreach (array_keys($array, 'strawberry') as $key) 
    unset($array[$key]);

【讨论】:

得到一个奇怪的结果。我使用了您的第一个建议,因为总是只有一个实例。为了测试它,我只是让它输出键值。工作。但是,它不会取消设置。 while(odbc_fetch_row($runqueryGetSubmenus)) $submenuList = odbc_result($runqueryGetSubmenus,"submenus"); $submenuArray = split(',',$submenuList); if (($key = array_search($name,$submenuArray)) !== false) unset($submenuArray[$key]); @dcp3450:你用$submenuArray做什么? (请注意,每个循环 $submenuArray 都会被覆盖。) 我更新了我的问题以便更好地解释。基本上,代码遍历数据库中的条目,删除所选项目,在本例中为“草莓”。因此,用户输入一个选项 => 代码在子菜单下搜索并找到任何具有该选项的列表 => 将该列表转换为一个数组 => 删除所选选项。 我明白了!我没有将新数组重写回数据库。长时间盯着代码很容易错过。

以上是关于PHP:如何从数组中删除特定元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python从数组中删除特定元素

如何从 numpy nd 数组中删除特定元素?

如何从结构类型数组的列中删除特定元素

如何从javascript或jquery中的元素数组中删除特定元素

如何使用jQuery从数组中删除特定值

在PHP中删除数组中的元素