19 Stimmen

Entfernen Sie alle Elemente eines Arrays mit nicht-numerischen Schlüsseln.

Ich habe ein Array, das ungefähr so aussieht:

Array
(
    [0] => apple
    ["b"] => banana
    [3] => cow
    ["wrench"] => duck
)

Ich möchte dieses Array nehmen und array_filter oder etwas Ähnliches verwenden, um Elemente mit nicht-numerischen Schlüsseln zu entfernen und das folgende Array zu erhalten:

Array
(
    [0] => apple
    [3] => cow
)

Ich habe darüber nachgedacht, und mir ist kein Weg eingefallen, dies zu tun, weil array_filter meiner Funktion den Schlüssel nicht zur Verfügung stellt und array_walk die Arraystruktur nicht ändern kann (wie im PHP-Handbuch besprochen).

38voto

Tim Cooper Punkte 150521

Ein foreach-Schleife wäre in diesem Fall angemessen:

foreach ($arr as $key => $value) {
    if (!is_int($key)) {
        unset($arr[$key]);
    }
}

25voto

smhg Punkte 2151

Es kann ohne Schleife in einer (langen) Zeile gemacht werden:

$a = array_intersect_key($a, array_flip(array_filter(array_keys($a), 'is_numeric')));

Was es macht:

  • Weil array_filter mit Werten arbeitet, erstellt array_keys zuerst ein neues Array mit den Schlüsseln als Werten (wobei die originalen Werte ignoriert werden).
  • Diese werden dann durch die Funktion is_numeric gefiltert.
  • Das Ergebnis wird dann wieder "umgedreht", so dass die Schlüssel wieder Schlüssel sind.
  • Schließlich nimmt array_intersect_key nur die Elemente aus dem Originalarray, die einen Schlüssel im Ergebnis des vorherigen Schritts haben (die numerischen Schlüssel).

Frag mich aber nicht nach der Leistung.

25voto

bishop Punkte 34542

Ab PHP 5.6 ist es jetzt möglich, array_filter in kompakter Form zu verwenden:

array_filter($array, function ($k) { return is_numeric($k); }, ARRAY_FILTER_USE_KEY);

Demo.

Dieser Ansatz ist auf meinem Rechner etwa 20% langsamer als eine for-Schleife (1,61 Sekunden gegenüber 1,31 Sekunden für 1 Million Durchläufe).


Ab PHP 7.4 ist es auch möglich, kurze Closures zu verwenden:

array_filter($array, fn($k) => is_numeric($k), ARRAY_FILTER_USE_KEY);

7voto

Scott Saunders Punkte 28742

Hier ist eine Schleife:

foreach($arr as $key => $value) {
    if($key !== 0 and !intval($key)) {
         unset($arr[$key]);
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X