我需要删除具有给定值的数组项:
if (in_array($id, $items)) { $items = array_flip($items); unset($items[ $id ]); $items = array_flip($items); }
可以用更短(更有效)的方式来完成吗?
试试 Array _ search ()
翻转:
<?php foreach ($items as $key => $value) { if ($id === $value) { unset($items[$key]); } }
最强大的解决方案是使用 array_filter,它允许您定义自己的过滤函数。
array_filter
但有些人可能会说,在你的情况下,这有点过火了..。 一个简单的 foreach循环遍历数组并删除您不需要的项应该足够了。
foreach
像这样的东西,在你的情况下,可能应该做的把戏:
foreach ($items as $key => $value) { if ($value == $id) { unset($items[$key]); // If you know you only have one line to remove, you can decomment the next line, to stop looping //break; } }
这个怎么样:
if (($key = array_search($id, $items)) !== false) unset($items[$key]);
或多重价值:
while(($key = array_search($id, $items)) !== false) { unset($items[$key]); }
这也可以防止键损失,这是 array_flip()的副作用。
array_flip()
您的解决方案只有在数组中有唯一值时才有效
参见:
<?php $trans = array("a" => 1, "b" => 1, "c" => 2); $trans = array_flip($trans); print_r($trans); ?>
更好的方法是取消 Array _ search的设置,如果需要,可以使用循环。
我正在添加第二个答案。我编写了一个快速基准测试脚本来尝试这里的各种方法。
$arr = array(0 => 123456); for($i = 1; $i < 500000; $i++) { $arr[$i] = rand(0,PHP_INT_MAX); } shuffle($arr); $arr2 = $arr; $arr3 = $arr; /** * Method 1 - array_search() */ $start = microtime(true); while(($key = array_search(123456,$arr)) !== false) { unset($arr[$key]); } echo count($arr). ' left, in '.(microtime(true) - $start).' seconds<BR>'; /** * Method 2 - basic loop */ $start = microtime(true); foreach($arr2 as $k => $v) { if ($v == 123456) { unset($arr2[$k]); } } echo count($arr2). 'left, in '.(microtime(true) - $start).' seconds<BR>'; /** * Method 3 - array_keys() with search parameter */ $start = microtime(true); $keys = array_keys($arr3,123456); foreach($keys as $k) { unset($arr3[$k]); } echo count($arr3). 'left, in '.(microtime(true) - $start).' seconds<BR>';
第三种方法 array_keys()带有指定的可选搜索参数,似乎是目前为止最好的方法。输出示例:
array_keys()
499999 left, in 0.090957164764404 seconds 499999left, in 0.43156313896179 seconds 499999left, in 0.028877019882202 seconds
根据这个判断,那么我将使用的解决方案是:
$keysToRemove = array_keys($items,$id); foreach($keysToRemove as $k) { unset($items[$k]); }
它可以通过一个简单的一行程序来完成。
有这个数组的:
$arr = array('nice_item', 'remove_me', 'another_liked_item', 'remove_me_also');
你可以这样做:
$arr = array_diff($arr, array('remove_me', 'remove_me_also'));
$arr的价值将是:
$arr
array('nice_item', 'another_liked_item')
从 $arr中移除 $rm_val
$rm_val
unset($arr[array_search($rm_val, $arr)]);
function deleteValyeFromArray($array,$value) { foreach($array as $key=>$val) { if($val == $value) { unset($array[$key]); } } return $array; }
可以对此操作使用 array _ splice 函数 Ref: Array _ splice
array_splice($array, array_search(58, $array ), 1);