我有一个PHP数组如下:

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

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

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


当前回答

如果你不知道它的键,那就意味着它无关紧要。

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

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

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

其他回答

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)

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

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

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

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]

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

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

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

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

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