PHP:删除所有未按预期运行的fcn,Code Inside

时间:2010-05-19 16:01:36

标签: php removeall

我做了这个简单的功能(从$ array中删除所有$ elem):

function remall($array, $elem) {
    for($i=0; $i < count($array); $i++)
        if($array[$i] == $elem)
            unset($array[$i]);
    $newarray = array_values($array);
    return $newarray;
}

但它没有完美运作,这里有一些输入和输出

$u = array(1, 7, 2, 7, 3, 7, 4, 7, 5, 7, 6, 7);
$r = remall($u, 7);
Output of $r: 12345767

$n = array(7, 7, 1, 7, 3, 4, 6, 7, 2, 3, 1, -3, 10, 11, 7, 7, 7, 2, 7);
$r = remall($n, 7);
Output of $r: 1346231-30117727

注意我的输出中仍然有7个。 此外,我的功能只会从数组中删除数字。 如果你发现了什么,请告诉我,谢谢。

解决方案:嘿伙计这对我有用(感谢Flavius Stef)

function remall($array, $elem) {
    return array_values(array_diff($array, array($elem)));
}

3 个答案:

答案 0 :(得分:8)

我会去

return array_diff($array, array($elem));

答案 1 :(得分:1)

function remall($array, $elem) {
    foreach($array as $k => $v)
        if($v == $elem)
            unset($array[$k]);
    return $array;
}

答案 2 :(得分:0)

你能保证输入数组是数字的(而不是关联的)并且键中没有'孔'吗?

您可能希望使用foreach ($array as $key => $value) { ... }而不是for ($i=0; $i < count($array); $i++) { ... }

除了第一段中描述的警告之外,第二种方法(您现在使用的方法)评估count() for的每次迭代 - unset()将改变该值,自然(首先你的数组有十个元素,然后在第一个匹配后,它将有九个,依此类推)。

另一个选择,即完全需要自己创建功能,可以使用 array_filter() 并提供自定义回调方法,但如果你的选择不是很好的选择标准变化很大(在你的例子中它是一个参数,它看起来就像是;)。

修改:根据array_diff()的答案,最佳解决方案(最可读且最易维护,同时完全按照您的意愿行事)将使用Flavius Stef

return array_diff($array, array($elem));