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

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

我有一个数组:

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

用户输入strawberry

strawberry 已从 $array 中删除。

全面解释:

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

【问题讨论】:

标签: php arrays


【解决方案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://stackoverflow.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 都会被覆盖。)
              • 我更新了我的问题以便更好地解释。基本上,代码遍历数据库中的条目,删除所选项目,在本例中为“草莓”。因此,用户输入一个选项 => 代码在子菜单下搜索并找到任何具有该选项的列表 => 将该列表转换为一个数组 => 删除所选选项。
              • 我明白了!我没有将新数组重写回数据库。长时间盯着代码很容易错过。
              猜你喜欢
              • 1970-01-01
              • 2019-06-03
              • 2022-01-21
              • 2021-04-20
              相关资源
              最近更新 更多