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++) { ... }ます。

最初の段落で説明した警告は別として、2 番目のアプローチ (現在使用しているもの)は-count()の各反復を評価し、その値を自然に変更します (最初に配列に 10 個の要素があり、最初の一致の後、それは' 9 個、など)。forunset()

独自の関数を完全に作成する必要性を回避する別のオプションはarray_filter()、カスタム コールバック メソッドを使用して提供することですが、基準が大幅に変更される場合はあまり良いオプションではありません (これは、例のパラメーターであり、それはそうであるように見えます;))。

編集: Flavius Stefの回答array_diff()によると、最良の解決策(最も読みやすく、最も保守しやすく、正確にやりたいことを行う)は、を使用することです:

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