$messages = [312, 401, 1599, 3, ...];
我想删除包含值$del_val
(例如$del_val=401
)的元素,但我不知道它的键。这可能有所帮助:每个值只能出现一次。
请为执行此任务提供最简单的函数。
$messages = [312, 401, 1599, 3, ...];
我想删除包含值$del_val
(例如$del_val=401
)的元素,但我不知道它的键。这可能有所帮助:每个值只能出现一次。
请为执行此任务提供最简单的函数。
array_search()
和 unset
,尝试以下操作:if (($key = array_search($del_val, $messages)) !== false) {
unset($messages[$key]);
}
array_search()
返回找到的元素的键,可以使用该键从原始数组中删除该元素,使用unset()
。如果失败,它将返回FALSE
,但是它可以在成功时返回一个假值(例如,您的键可能是0
),这就是为什么使用严格比较!==
运算符。
if()
语句将检查array_search()
是否返回了一个值,并且只有在返回值时才执行操作。
array_diff()
会更慢,因为它需要比较 两个 数组,而不仅仅像 array_search()
那样搜索 一个 数组。 - Bojangles0
或任何其他 falsy 值,则它不会取消设置该值,你的代码将无法正常工作。你应该测试 $key === false
。(编辑 - 你明白了) - evan删除数组中的一个元素基本上就是将带有该元素的差集设置为:
differencearray_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]
它的泛化效果很好,如果需要,您可以同时删除任意数量的元素。
免责声明:请注意,与被接受的答案(会改变原数组)不同,我的解决方案在保持旧数组不变的同时生成一个新副本。请选择符合需求的。
[$element]
这个语法而出现了“解析错误”,我改用了 array($element)
。这不是什么大问题,但我想让其他遇到类似问题的人知道他们并不孤单。 - Angadarray_diff
使用(string) $elem1 === (string) $elem2
作为其相等条件,而不是您可能期望的$elem1 === $elem2
。@nischayn22指出的问题就是这个条件导致的。如果您想要一个适用于任意元素数组(可能是对象)的实用函数,则Bojangle的答案可能更好。 - Mark Ameryarray_diff()
的每个参数执行内部排序,因此将运行时间从O(n)增加到O(n lg n)。 - Ja͢ckarray_keys()
函数:foreach (array_keys($messages, 401, true) as $key) {
unset($messages[$key]);
}
函数array_keys()
接受两个额外的参数,以返回特定值的键,并确定是否需要进行严格检查(即使用===进行比较)。
这还可以删除具有相同值的多个数组项(例如[1, 2, 3, 3, 4]
)。
array_values()
函数;虽然剩余的键仍然按照原来的顺序排列,所以严格来说它并不是"未排序"。 - Ja͢ckarray_keys()
可以进行搜索。 - But those new buttons though..如果你确定你的数组只包含一个具有该值的元素,你可以这样做:
$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+。
$fields = array_flip($fields);
unset($fields['myvalue']);
$fields = array_flip($fields);
使用 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));
foreach()
循环,但这种方法更加简洁。 - But those new buttons though..最好的方法是使用array_splice
array_splice($array, array_search(58, $array ), 1);
[1, 2, 4 => 3]
。 - Ja͢ck或者简单地说,手动方式:
foreach ($array as $key => $value){
if ($value == $target_value) {
unset($array[$key]);
}
}
这是它们中最安全的,因为您可以完全控制您的数组
array_splice()
而不是unset()
将重新排序数组索引,这可能更好。 - Daniele Orlandofunction 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);
输出
数组 ( [0] => 312 [1] => 1599 [2] => 3 )
你可以做:
unset($messages[array_flip($messages)['401']]);
说明:翻转数组后删除具有键 401
的元素。