455 Stimmen

Array nach seinen Schlüsseln filtern, indem man ein Array von erlaubten Schlüsseln verwendet

Die Rückruffunktion in array_filter() übergibt nur die Werte des Arrays, nicht die Schlüssel.

Wenn ich es habe:

$my_array = array("foo" => 1, "hello" => "world");

$allowed = array("foo", "bar");

Wie lösche ich am besten alle Schlüssel in $my_array die sich nicht in der $allowed Array?

Gewünschter Output:

$my_array = array("foo" => 1);

0voto

sepiariver Punkte 381

Eine naive und hässliche (aber scheinbar schnellere) Lösung?

Ich habe dies nur in php 7.3.11 ausprobiert, aber eine hässliche Schleife scheint in etwa einem Drittel der Zeit ausgeführt zu werden. Ähnliche Ergebnisse bei einem Array mit ein paar hundert Schlüsseln. Mikro-Optimierung, wahrscheinlich nicht nützlich in RW, aber ich fand es überraschend und interessant:

$time = microtime(true);
$i = 100000;
while($i) {
    $my_array = ['foo' => 1, 'hello' => 'world'];
    $allowed  = ['foo', 'bar'];
    $filtered = array_filter(
        $my_array,
        function ($key) use ($allowed) {
            return in_array($key, $allowed);
        },
        ARRAY_FILTER_USE_KEY
    );
    $i--;
}
print_r($filtered);
echo microtime(true) - $time . ' on array_filter';

// 0.40600109100342 on array_filter
$time2 = microtime(true);
$i2 = 100000;
while($i2) {
    $my_array2 = ['foo' => 1, 'hello' => 'world'];
    $allowed2  = ['foo', 'bar'];
    $filtered2 = [];
    foreach ($my_array2 as $k => $v) {
        if (in_array($k, $allowed2)) $filtered2[$k] = $v;
    }
    $i2--;
}
print_r($filtered2);
echo microtime(true) - $time2 . ' on ugly loop';
// 0.15677785873413 on ugly loop

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