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

时间:2010-03-15 17:05:31

标签: php arrays

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

我有一个数组:

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

用户输入strawberry

strawberry已删除。

完全解释:

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

24 个答案:

答案 0 :(得分:259)

使用array_search获取密钥,如果找到则将其与unset一起删除:

if (($key = array_search('strawberry', $array)) !== false) {
    unset($array[$key]);
}
如果没有找到任何项目,

array_search会返回 false null ,直到PHP 4.2.0)。

如果可以有多个具有相同值的项目,您可以使用array_keys获取所有项目的键:

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

答案 1 :(得分:122)

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循环。

答案 2 :(得分:35)

if (in_array('strawberry', $array)) 
{
    unset($array[array_search('strawberry',$array)]);
}

答案 3 :(得分:19)

如果你在这里使用普通数组(看起来就是这种情况),你应该使用这个代码:

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])如何不对数组重新排序。

答案 4 :(得分:7)

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

答案 5 :(得分:4)

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

    // 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]);
    }

答案 6 :(得分:3)

我目前正在使用此功能:

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

OR

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

它还会重新编制索引。

答案 7 :(得分:2)

将是这样的:

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

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

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

答案 8 :(得分:2)

只需执行一行操作即可,它将是从数组中删除元素


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


答案 9 :(得分:1)

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

答案 10 :(得分:1)

这个问题有几个答案,但我想添加更多内容,因为当我使用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

因此最终数组不会重新编入索引。因此,您需要在unsetarray_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

enter image description here

希望它会有所帮助

答案 11 :(得分:1)

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]

它很好地概括,如果你愿意,你可以同时删除任意数量的元素。

免责声明:请注意,我的解决方案会生成一个新的数组副本,同时保持旧数据的完整性与已接受的变异形式相反。因此可能会慢一些。

答案 12 :(得分: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);

    ?>

You Can Refer this link..

答案 13 :(得分:0)

我更愿意使用 array_key_exists 来搜索数组中的键:

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

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

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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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

https://glot.io/snippets/f6ow6biaol

答案 17 :(得分:0)

使用这种简单的方法希望会对您有所帮助

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

答案 18 :(得分:0)

你可以试试这个

<?php

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

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

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

?>

答案 19 :(得分:-1)

$ delete =“strawberry”;

$ index = array_search($ delete,$ array);

array_splice($ array,$ index,1);

答案 20 :(得分:-1)

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

答案 21 :(得分:-1)

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

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

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

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

答案 22 :(得分:-1)

foreach ($get_dept as $key5 => $dept_value) {
                if ($request->role_id == 5 || $request->role_id == 6){
                    array_splice($get_dept, $key5, 1);
                }
            }

答案 23 :(得分:-2)

$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);
相关问题