Heim  >  Artikel  >  Backend-Entwicklung  >  Unterschiede zwischen array_diff und anderen Möglichkeiten zur Implementierung der PHP-Array-Traversierung

Unterschiede zwischen array_diff und anderen Möglichkeiten zur Implementierung der PHP-Array-Traversierung

巴扎黑
巴扎黑Original
2017-05-24 14:34:091549Durchsuche

Geben Sie zwei Arrays mit jeweils 5000 Elementen und berechnen Sie deren Differenz. Vereinfacht ausgedrückt bedeutet dies, dass Sie PHP und den Algorithmus verwenden, der Ihrer Meinung nach der beste ist, um den array_diff-Algorithmus zu implementieren.

Als ich diese Frage zum ersten Mal erhielt, fand ich sie sehr einfach, also habe ich eine basierend auf meinen bisherigen Erfahrungen geschrieben:

function array_diff($array_1, $array_2) { 
    $diff = array(); 
 
    foreach ($array_1 as $k => $v1) { 
        $flag = false; 
        foreach ($array_2 as $v2) { 
            if ($flag = ($v1 == $v2)) { 
                break; 
            } 
        } 
 
        if (!$flag) { 
            $diff[$k] = $v1; 
            
        } 
    } 
 
    return $diff; 
}

Obwohl die Implementierung möglich ist, habe ich festgestellt, dass die Die Effizienz dieser Funktion ist schrecklich. Also habe ich den Algorithmus noch einmal überdacht und optimiert. Die zweite Funktion sah so aus:

function array_diff($array_1, $array_2) { 
    foreach ($array_1 as $key => $item) { 
        if (in_array($item, $array_2, true)) { 
            unset($array_1[$key]); 
        } 
    } 
 
    return $array_1; 
}

Nun, dieses Mal ist sie fast so schnell wie die ursprüngliche array_diff-Funktion. Aber gibt es einen optimierteren Weg? In einem Artikel über ChinaUnix habe ich herausgefunden, dass PHP folgendermaßen geschrieben werden kann:

function array_diff($array_1, $array_2) { 
    $array_2 = array_flip($array_2); 
    foreach ($array_1 as $key => $item) { 
        if (isset($array_2[$item])) { 
            unset($array_1[$key]); 
        } 
     } 
 
    return $array_1; 
}

Die Effizienz dieser Funktion ist erstaunlich, sogar schneller als die ursprüngliche array_diff-Funktion. Als ich den Grund untersuchte, fand ich eine Erklärung: Da die Schlüssel nach HASH organisiert sind, ist die Suche sehr schnell, während der Wert nur in der Schlüsselorganisation gespeichert wird und keinen Index selbst hat, sodass jede Suche durchlaufen wird.

Zusammenfassung

Obwohl dies ein kleiner Trick der PHP-Sprache ist, ist es beim Durchlaufen und Vergleichen der Werte des Arrays sinnvoll, den Wert zu invertieren, wenn Sie ihn mit dem Schlüssel vergleichen müssen tatsächlich besser als das übliche Wert-zu-Wert-Verhältnis. Die Vergleichseffizienz ist viel höher.

Funktion zwei oben muss beispielsweise die Funktion in_array aufrufen und eine Schleife durchlaufen, um festzustellen, ob sie sich innerhalb der Funktion befindet, während Funktion drei nur ermittelt, ob der Schlüssel im Array vorhanden ist. In Verbindung mit den unterschiedlichen organisatorischen Indizierungsmethoden von Array-Schlüsseln und -Werten ist es sehr verständlich, dass die Effizienz höher ist als gedacht.

Das obige ist der detaillierte Inhalt vonUnterschiede zwischen array_diff und anderen Möglichkeiten zur Implementierung der PHP-Array-Traversierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn