Doppelte Array-Einträge entfernen
Vor kurzem hatte ich das kleine Problemchen dass in einem Array die Werte (Strings und Integer) mehrfach vorkamen, ich diese aber nicht gebrauchen konnte. Mit array_unique() kann man doppelte bzw. mehrfach vorkommende Werte auf ein Vorkommen reduzieren, aber es gibt keine direkte Methode um mehrfach vorkommende Werte ganz zu entfernen.
Beispiel: Aus dem Array (1, 5, 8, ‘Michael’, 5, 4, 9, ‘Martin’, 18, 12, ‘Michael’, 4, 12) sollen die mehrfach vorkommenden Werte entfernt werden, sodass nur noch das Array (1, 8, 9, ‘Martin’, 18) übrig bleibt.
Meine einfache und erste Lösung ist die folgende:
function removeDuplicates($array) { $counts = array_count_values($array); foreach ($counts as $value => $counter) { if ($counter > 1) { unset($counts[$value]); } } return array_keys($counts); }
Der Aufruf sieht dann wie folgt aus:
$a = array(1, 5, 8, 'Michael', 5, 4, 9, 'Martin', 18, 12, 'Michael', 4, 12); var_dump(removeDuplicates($a));
Habt ihr eine andere/bessere Funktion? Gerade bei sehr großen Arrays wäre es evtl. interessant schnellere Lösungen zu kennen, denn meine durchläuft das Array 3 Mal (array_count_values(), meine foreach Schleife und array_keys()), es müßte auch mit einem oder maximal 2 Schleifendurchläufen gehen…
Edit:
Mir ist gerade noch nach dem Schreiben des Artikels eine zweite Lösung eingefallen, die aber bei sehr großen Arrays genauso langsam sein dürfte und etwas schwerer zu durchschauen ist:
function removeDuplicates($array) { return array_diff($array, array_diff_assoc($array, array_unique($array))); }
Ähnliche Artikel: