Frage

Ich habe diese einfache Funktion (entfernen Sie alle $ Elem von $ array):

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

Aber es ist nicht perfekt funktioniert, hier sind einige Ein- und Ausgänge

$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

Beachten Sie, wie es 7s noch in meinen Ausgängen. Außerdem wird meine Funktion nur Zahlen aus einem Array werden zu entfernen. Lassen Sie mich wissen, wenn Sie etwas, dank beschmutzen.

LÖSUNG: Hey Jungs, das ist was für mich gearbeitet (Danke an Flavius ??Stef)

function remall($array, $elem) {
    return array_values(array_diff($array, array($elem)));
}
War es hilfreich?

Lösung

Ich würde gehen mit

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

Andere Tipps

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

Können Sie garantieren, dass der Eingangs-Array numerisch ist (und nicht assoziativ) und ohne ‚Löcher‘ in den Tasten?

Sie möchten foreach ($array as $key => $value) { ... } verwenden, anstatt for ($i=0; $i < count($array); $i++) { ... }.

Neben der Einschränkung im ersten Absatz beschrieben, der zweite Ansatz (die Sie verwenden jetzt) ??auswertet count() jede Iteration von for - und unset() wird diesen Wert ändern, natürlich (erste Array hat zehn Elemente, dann nach das erste Spiel, es wird neun haben, und so weiter).

Eine weitere Möglichkeit, die Notwendigkeit ausweicht Ihre eigene Funktion vollständig zu machen, wäre für Sie verwenden array_filter() und eine benutzerdefinierte Callback-Methode liefern, das ist aber nicht eine sehr gute Option, wenn Ihr criterium viel ändert (was, es ist ein Parameter in Ihrem Beispiel zu sein, es ist wie es wäre aussieht;)).

Bearbeiten : Die beste Lösung (am besten lesen und die meisten wartbar, während genau das tun, was Sie wollen) zu verwenden wäre, array_diff() , wie per Flavius ??Stef 's Antwort:

return array_diff($array, array($elem));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top