我有一个PHP数组如下:

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

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

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


当前回答

如果你明确知道你的数组将只包含一个具有该值的元素,你可以这样做

$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+

其他回答

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

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

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

$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中使用箭头函数:

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

为了保持它是一个非关联数组,用array_values()来包装它:

$messages = array_values(array_filter($messages, fn ($m) => $m != $del_val));
$fields = array_flip($fields);
unset($fields['myvalue']);
$fields = array_flip($fields);

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

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