PHP数组按值删除(不是键)

时间:2011-08-29 00:44:04

标签: php arrays

我有一个PHP数组如下:

$messages = [312, 401, 1599, 3, ...];

我想删除包含值$del_val的元素(例如,$del_val=401),但我不知道它的键。这可能有所帮助:每个值只能在那里

我正在寻找最简单的功能来执行此任务。

30 个答案:

答案 0 :(得分:1385)

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

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

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

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

答案 1 :(得分:559)

好吧,从数组中删除一个元素基本上只用一个元素设置difference

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

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

免责声明:请注意,我的解决方案会生成一个新的数组副本,同时保持旧数据的完整性与已接受的变异形式相反。选择你需要的那个。

答案 2 :(得分:102)

一种有趣的方法是使用array_keys()

foreach (array_keys($messages, 401, true) as $key) {
    unset($messages[$key]);
}

array_keys()函数需要两个额外的参数来仅返回特定值的键以及是否需要严格检查(即使用===进行比较)。

这也可以删除具有相同值的多个数组项(例如[1, 2, 3, 3, 4])。

答案 3 :(得分:46)

如果您确定您的数组只包含一个具有该值的元素,则可以执行

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

但是,如果您的数值可能在数组中出现多次,则可以执行此操作

$array = array_filter($array, function($e) use ($del_val) {
    return ($e !== $del_val);
});

注意:第二个选项仅适用于PHP5.3 + Closures

答案 4 :(得分:36)

$fields = array_flip($fields);
unset($fields['myvalue']);
$fields = array_flip($fields);

答案 5 :(得分:25)

查看以下代码:

$arr = array('nice_item', 'remove_me', 'another_liked_item', 'remove_me_also');

你可以这样做:

$arr = array_diff($arr, array('remove_me', 'remove_me_also'));

这会得到你这个数组:

array('nice_item', 'another_liked_item')

答案 6 :(得分:21)

最佳方式是array_splice

array_splice($array, array_search(58, $array ), 1);

Best的原因在http://www.programmerinterview.com/index.php/php-questions/how-to-delete-an-element-from-an-array-in-php/

答案 7 :(得分:19)

通过以下代码,重复值将从$ messages中删除。

$messages = array_diff($messages, array(401));

答案 8 :(得分:16)

或者简单地说,手动方式:

foreach ($array as $key => $value){
    if ($value == $target_value) {
        unset($array[$key]);
    }
}

这是最安全的,因为您可以完全控制阵列

答案 9 :(得分:11)

function array_remove_by_value($array, $value)
{
    return array_values(array_diff($array, array($value)));
}

$array = array(312, 401, 1599, 3);

$newarray = array_remove_by_value($array, 401);

print_r($newarray);

<强>输出

Array ( [0] => 312 [1] => 1599 [2] => 3 )

答案 10 :(得分:9)

如果你有&gt; php5.3,有一行代码:

$array = array_filter($array, function($i) use ($value){return $i != $value;}); 

答案 11 :(得分:8)

要删除多个值,请尝试使用

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

答案 12 :(得分:8)

使用箭头功能的PHP 7.4:

$messages = array_filter($messages, fn ($m) => $m != $del_val);

要将其保留为非关联数组,请使用array_values()将其包装起来:

$messages = array_values(array_filter($messages, fn ($m) => $m != $del_val));

答案 13 :(得分:8)

你可以这样做:

unset($messages[array_flip($messages)['401']]);

说明:在翻转数组后删除具有键401的元素。

答案 14 :(得分:5)

借用下划线JS _.reject的逻辑并创建了两个函数(人们更喜欢函数!!)

array_reject_value:此函数只是拒绝指定的值(也适用于PHP4,5,7)

function array_reject(array &$arrayToFilter, callable $rejectCallback) {

    $filteredArray = array();

    foreach ($arrayToFilter as $key => $value) {
        if (!$rejectCallback($value, $key)) {
            $filteredArray[] = $value;
        }
    }

    return $filteredArray;
}

array_reject:此函数只是拒绝可调用方法(适用于PHP&gt; = 5.3)

$messages = [312, 401, 1599, 3, 6];
$messages = array_reject_value($messages, 401);

因此,在我们当前的例子中,我们可以使用以下函数:

$messages = [312, 401, 1599, 3, 6];
$messages = array_reject($messages, function ($value) {
    return $value === 401;
});

甚至更好:(因为这为我们提供了更好的语法,如array_filter一个)

$messages = [312, 401, 1599, 3, 6];
$greaterOrEqualThan = 401;
$messages = array_reject($messages, function ($value) use $greaterOrEqualThan {
    return $value >= $greaterOrEqualThan;
});

以上内容可用于更复杂的内容,例如我们想删除所有大于或等于401的值,我们可以简单地执行此操作:

{{1}}

答案 15 :(得分:4)

单行代码(感谢to_numeric),请使用以下内容:

$messages = array_diff($messages, array(401));

答案 16 :(得分:4)

@Bojangles的答案对我有帮助。谢谢。

在我的情况下,数组可以是关联的,所以我添加了这个函数

function test($value, $tab) {

 if(($key = array_search($value, $tab)) !== false) {
    unset($tab[$key]); return true;

 } else if (array_key_exists($value, $tab)){
        unset($tab[$value]); return true;

 } else {
    return false; // the $value is not in the array $tab
 }

}

此致

答案 17 :(得分:4)

使用array_search()获取密钥。

答案 18 :(得分:3)

好的..我知道这根本不高效,但简单,直观,易于阅读 因此,如果有人正在寻找一个不那么花哨的解决方案,可以扩展到更多的值或更具体的条件。这里有一个简单的代码:

$result = array();
$del_value = 401;
//$del_values = array(... all the values you don`t wont);

foreach($arr as $key =>$value){
    if ($value !== $del_value){
        $result[$key] = $value;
    }

    //if(!in_array($value, $del_values)){
    //    $result[$key] = $value;
    //}

    //if($this->validete($value)){
    //      $result[$key] = $value;
    //}
}

return $result

答案 19 :(得分:3)

如果要删除的值是,或者可以在数组中。使用array_diff函数。似乎对这样的事情很有用。

array_diff

$arrayWithValuesRemoved = array_diff($arrayOfData, $arrayOfValuesToRemove);

答案 20 :(得分:3)

根据您的要求&#34; 每个值只能在那里&#34;如果您只想在数组中保留唯一值,那么array_unique()可能就是您要找的。

<强>输入:

$input = array(4, "4", "3", 4, 3, "3");
$result = array_unique($input);
var_dump($result);

<强>结果:

array(2) {
  [0] => int(4)
  [2] => string(1) "3"
}

答案 21 :(得分:3)

接受的答案是,将数组转换为关联数组,因此,如果您希望将其保留为具有接受答案的非关联数组,则可能还必须使用array_values

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

引用为here

答案 22 :(得分:3)

$array = array("apple", "banana",'mango');
$array = array_filter($array, function($v) { return $v != "apple"; });

尝试一下,这是按值删除元素的最好,最快的方法

答案 23 :(得分:2)

如果您不知道它的密钥,则表示无关紧要。

您可以将值作为键,这意味着它将立即找到该值。比在所有元素中反复搜索更好。

$messages=array();   
$messages[312] = 312;    
$messages[401] = 401;   
$messages[1599] = 1599;   
$messages[3] = 3;    

unset($messages[3]); // no search needed

答案 24 :(得分:2)

使用or运算符的单行代码:

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

答案 25 :(得分:1)

你可以参考这个URL:     功能

array-diff-key()

<?php
$array1 = array('blue'  => 1, 'red'  => 2, 'green'  => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan'   => 8);

var_dump(array_diff_key($array1, $array2));
?>

然后输出应该是,

array(2) {
  ["red"]=>
  int(2)
  ["purple"]=>
  int(4)
}

答案 26 :(得分:1)

我认为最简单的方法是使用带有foreach循环的函数:

//This functions deletes the elements of an array $original that are equivalent to the value $del_val
//The function works by reference, which means that the actual array used as parameter will be modified.

function delete_value(&$original, $del_val)
{
    //make a copy of the original, to avoid problems of modifying an array that is being currently iterated through
    $copy = $original;
    foreach ($original as $key => $value)
    {
        //for each value evaluate if it is equivalent to the one to be deleted, and if it is capture its key name.
        if($del_val === $value) $del_key[] = $key;
    };
    //If there was a value found, delete all its instances
    if($del_key !== null)
    {
        foreach ($del_key as $dk_i)
        {
            unset($original[$dk_i]);
        };
        //optional reordering of the keys. WARNING: only use it with arrays with numeric indexes!
        /*
        $copy = $original;
        $original = array();
        foreach ($copy as $value) {
            $original[] = $value;
        };
        */
        //the value was found and deleted
        return true;
    };
    //The value was not found, nothing was deleted
    return false;
};

$original = array(0,1,2,3,4,5,6,7,4);
$del_val = 4;
var_dump($original);
delete_value($original, $del_val);
var_dump($original);

输出将是:

array(9) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(2)
  [3]=>
  int(3)
  [4]=>
  int(4)
  [5]=>
  int(5)
  [6]=>
  int(6)
  [7]=>
  int(7)
  [8]=>
  int(4)
}
array(7) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(2)
  [3]=>
  int(3)
  [5]=>
  int(5)
  [6]=>
  int(6)
  [7]=>
  int(7)
}

答案 27 :(得分:1)

PHP 7.4 或更高版本

function delArrValues(array $arr, array $remove) {
    return array_filter($arr, fn($e) => !in_array($e, $remove));
};

所以,如果你有这样的数组

$messages = [312, 401, 1599, 3];

并且您想从 $messages 数组中删除两个 3, 312, 你会这样做

delArrValues($messages, [3, 312])

它会回来

[401, 1599]

最好的部分是您可以轻松过滤多个值,即使同一值出现多次。

答案 28 :(得分:0)

删除数组值的另一个想法是使用array_diff。如果我想

$my_array = array(1=>"a", "second_value"=>"b", 3=>"c", "d");
$new_array_without_value_c = array_diff($my_array, array("c"));

(文件:http://php.net/manual/fr/function.array-diff.php

答案 29 :(得分:0)

这是一个简单但可以理解的解决方案:

$messagesFiltered = [];
foreach ($messages as $message) {
    if (401 != $message) {
        $messagesFiltered[] = $message;
    }
}
$messages = $messagesFiltered;