我有一个PHP数组如下:

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

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

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


当前回答

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

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

其他回答

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

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

它很好地泛化了,你可以同时删除任意多的元素,如果你想的话。

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

接受的答案将数组转换为关联数组,因此,如果您希望将其作为与接受的答案的非关联数组,您可能也必须使用array_values。

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

参考资料在这里

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

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

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

借用了underscore.JS _的逻辑。拒绝并创建了两个函数(人们更喜欢函数!!)

array_reject_value:该函数简单地拒绝指定的值(也适用于PHP4,5,7)

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)

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

    $filteredArray = array();

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

    return $filteredArray;
}

所以在我们当前的例子中,我们可以像下面这样使用上述函数:

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

或者甚至更好:(因为这给了我们更好的语法使用,比如array_filter)

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

上面的代码可以用于更复杂的事情,比如我们想要删除所有大于或等于401的值,我们可以简单地这样做:

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