我有一个PHP数组如下:

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

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

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


当前回答

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

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

其他回答

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

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

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

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

根据您的要求“每个值只能出现一次”,如果您只是想在数组中保持唯一的值,那么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"
}

要删除多个值,试试这个:

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

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

$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

PHP 7.4或以上

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

如果你有数组as

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

你想从$messages数组中删除3,312, 你会这样做

delArrValues($messages, [3, 312])

它会返回

[401, 1599]

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