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

PHP array delete by value (not key)

我有一个PHP数组,如下所示:

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

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

我正在寻找执行此任务的最简单函数。


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

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

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

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


从数组中删除一个元素基本上就是用一个元素设置差异。

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

它可以很好地进行归纳,如果需要的话,您可以同时删除任意多的元素。

免责声明:请注意,我的解决方案生成了一个新的数组副本,同时保持旧数组的完整性,与公认的可变答案形成对比。选择你需要的那个。


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

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

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

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


如果确定数组只包含一个具有该值的元素,可以这样做

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

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

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

注:第二个选项仅适用于带闭包的php5.3+。


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


查看以下代码:

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

你可以做到:

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

这样就可以得到这个数组:

1
array('nice_item', 'another_liked_item')


最好的办法是array_splice

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

最好的理由在http://www.programmerinterview.com/index.php/php-questions/how-to-delete-an-element-from-an-array-in-php/


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

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


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

1
2
3
4
5
foreach ($array as $key => $value){
    if ($value == $target_value) {
        unset($array[$key]);
    }
}

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


1
2
3
4
5
6
7
8
9
10
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 )


如果您有>php5.3,则有一行代码:

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


你可以做到:

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

说明:翻转数组后,删除键为401的元素。


要删除多个值,请尝试此操作

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

借鉴了下划线JS uureject的逻辑,创建了两个函数(人们更喜欢函数!!)

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

1
2
3
4
5
6
7
8
9
10
11
function array_reject_value(array &$arrayToFilter, $deleteValue) {
    $filteredArray = array();

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

    return $filteredArray;
}

array_reject:此函数只是拒绝可调用方法(适用于php>=5.3)

1
2
3
4
5
6
7
8
9
10
11
12
function array_reject(array &$arrayToFilter, callable $rejectCallback) {

    $filteredArray = array();

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

    return $filteredArray;
}

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

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

或者更好:(因为这给了我们一个更好的语法,可以像数组过滤器一样使用)

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

上面的内容可以用于更复杂的事情,比如说,我们想删除所有大于或等于401的值,我们可以简单地做到:

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


array_search()拿到钥匙。


@Bojangles的回答确实帮助了我。谢谢您。

在我的例子中,数组可以是关联的,也可以不是关联的,所以我添加了这个函数

1
2
3
4
5
6
7
8
9
10
11
12
13
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
 }

}

当做


单行代码(由于array_diff(),使用以下代码:

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

如果要删除的值位于或可以位于数组中。使用数组diff函数。似乎对这样的事情很有用。

阿雷耶夫迪夫

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


好啊。。我知道这一点效率都不高,但简单、直观、易读。因此,如果有人正在寻找一个不那么花哨的解决方案,可以扩展到使用更多值或更具体的条件。下面是一个简单的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$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


根据您的要求,"每个值只能存在一次",如果您只想在数组中保留唯一的值,那么array_unique()可能就是您要查找的。

输入:

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

结果:

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

接受的答案会将数组转换为关联数组,因此,如果要将它与接受的答案保持为非关联数组,则可能还必须使用array_values

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

参考资料在这里


或者使用or操作符的一个线性:

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

如果你不知道它的钥匙,这意味着它无关紧要。

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

1
2
3
4
5
6
7
$messages=array();  
$messages[312] = 312;    
$messages[401] = 401;  
$messages[1599] = 1599;  
$messages[3] = 3;    

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


您可以引用此URL:为了功能

1
2
3
4
5
6
7
8
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));
?>

那么输出应该是,

1
2
3
4
5
6
array(2) {
  ["red"]=>
  int(2)
  ["purple"]=>
  int(4)
}


另一个删除数组值的方法是使用数组diff。

1
2
$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)