2

我做了这个简单的函数(从 $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)));
}
4

3 回答 3

8

我会去

return array_diff($array, array($elem));
于 2010-05-19T16:11:58.047 回答
1
function remall($array, $elem) {
    foreach($array as $k => $v)
        if($v == $elem)
            unset($array[$k]);
    return $array;
}
于 2010-05-19T16:06:31.537 回答
0

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

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

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

另一种选择是完全避开制作自己的函数的需要,您可以使用array_filter()并提供自定义回调方法,但如果您的标准发生很大变化,这不是一个很好的选择(在您的示例中,它是一个参数,看起来会是;))。

编辑array_diff():根据Flavius Stef的回答,最好的解决方案(最易读和最可维护,同时做你想做的事)是使用:

return array_diff($array, array($elem));
于 2010-05-19T16:09:45.163 回答