Navigation
 Startseite
 Fachbücher
 Anzeigenmarkt
 Forum
 Webmaster News
 Script Newsletter
 Kontakt
 Script Installation
 Php
 Php Tutorials
 Webhoster Vergleich
 Impressum

Community-Bereich
 kostenlos Registrieren
 Anmelden
 Benutzerliste

Script Datenbank
 Script Archiv
 Script Top 20
 Screenshots
 Testberichte

Suche
 

Unsere Php Scripts
 Counter Script
 Umfrage Script
 Bilder Upload Script
 Terminverwaltung
 Simple PHP Forum
 RSS Grabber

Script Mods
 phpBB Adsense Mode

Tools und Generatoren
 .htpasswd Generator
 md5 Generator
 base64 Generator
 Markdown to HTML
 Colorpicker
 Unix timestamp Tool
 TLD Liste
 Webkatalog‑Verzeichnis

Partner
 Sprüche Treff

Artfiles.de
Bietet Serviceorientierte...
https://www.Artfiles.de
Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains...
https://www.Hosterplus.de
 
 
 

Doppelte Einträge im Array löschen

Sie befinden sich: Home > Php Tutorial > Doppelte Einträge im Array...

Doppelte Einträge im Array löschen


Eintrag am:  24.01.2023
Hits / Besucher:  1538
Sprache:  Deutsch
Kategorie:  Einsteiger Tutorials
Tutorial Art:  eigenes
Eingetragen von   schubertmedia schubertmedia
 
Beschreibung

Wenn ein Array doppelte Werte enthält und man nur die eindeutigen Einträge behalten möchte, ist array_unique() die passende Funktion. Sie durchsucht das Array, entfernt alle Duplikate und gibt ein neues Array mit nur einmaligen Werten zurück. Dabei bleibt jeweils der erste Eintrag erhalten, alle späteren Vorkommen desselben Wertes werden entfernt.

Syntax und Grundlagen

Die Funktion erwartet ein Array und optional einen Flag für den Vergleichsmodus:

array_unique(array $array, int $flags = SORT_STRING): array

Der Rückgabewert ist ein neues Array ohne Duplikate. Die Schlüssel aus dem Original-Array bleiben erhalten, was zu Lücken in den numerischen Indizes führen kann. Standardmäßig werden die Werte als Strings verglichen (SORT_STRING).

Beispiel: Duplikate aus einem numerischen Array entfernen

Im einfachsten Fall übergibt man ein Array mit doppelten Einträgen und erhält die bereinigte Version zurück:

<?php

$farben = ["rot", "blau", "grün", "rot", "gelb", "blau"];
$eindeutig = array_unique($farben);
print_r($eindeutig);
?>

Ausgabe:

Array

(
[0] => rot
[1] => blau
[2] => grün
[4] => gelb
)

Die doppelten Einträge "rot" (Index 3) und "blau" (Index 5) wurden entfernt. Beachte, dass die Schlüssel [3] und [5] fehlen. Das Array hat Lücken in den Indizes. Um die Ausgabe lesbar zu machen, nutzen wir hier die print_r()-Funktion.

Neuindizierung mit array_values()

Nach dem Entfernen von Duplikaten hat das Ergebnis-Array oft Lücken in den Indizes. Das kann bei json_encode() oder Zählschleifen Probleme verursachen, weil PHP das Array dann als Objekt statt als Liste kodiert. Mit array_values() lassen sich die Indizes lückenlos neu vergeben:

<?php

$zahlen = [10, 20, 30, 10, 20];
$eindeutig = array_unique($zahlen);

print_r($eindeutig);
/* Array ( [0] => 10 [1] => 20 [2] => 30 ) */

/* Neu indizieren */
$clean = array_values($eindeutig);
print_r($clean);
/* Array ( [0] => 10 [1] => 20 [2] => 30 ) */
?>

In diesem Beispiel sind die Indizes zufällig schon lückenlos. Bei größeren Arrays mit vielen Duplikaten entstehen aber regelmäßig Lücken. Als Faustregel: Wenn das Ergebnis weiterverarbeitet wird (z.B. als JSON-Response), immer array_values() anwenden.

Flags: Vergleichsmodus steuern

array_unique() akzeptiert als zweiten Parameter einen Flag, der bestimmt, wie die Werte verglichen werden:

FlagVergleichBeispiel
SORT_STRINGAls Strings (Standard)"1" und 1 gelten als gleich
SORT_REGULARNormaler VergleichTyp wird berücksichtigt, wie bei ==
SORT_NUMERICAls Zahlen"1" und 1.0 gelten als gleich
SORT_LOCALE_STRINGLocale-abhängigBerücksichtigt lokale Zeichensatz-Regeln

Ein Beispiel mit gemischten Datentypen zeigt den Unterschied:

<?php

$gemischt = ["1", 1, true, 1.0, "01"];

$standard = array_unique($gemischt);
print_r($standard);
/* SORT_STRING: Array ( [0] => 1 [2] => 1 [4] => 01 ) */

$regular = array_unique($gemischt, SORT_REGULAR);
print_r($regular);
/* SORT_REGULAR: Array ( [0] => 1 [4] => 01 ) */
?>

Mit SORT_STRING werden die Werte zuerst in Strings umgewandelt. true wird dabei zu "1", bleibt also als Duplikat von "1" bestehen. "01" ist als String verschieden von "1" und wird beibehalten. Mit SORT_REGULAR fällt zusätzlich true weg, da true == 1 gilt.

Praxisbeispiel: E-Mail-Adressen bereinigen

Ein häufiger Anwendungsfall ist die Bereinigung von Benutzereingaben. Wenn z.B. E-Mail-Adressen aus einem Formular eingelesen werden, können Duplikate mit unterschiedlicher Groß-/Kleinschreibung auftreten. Mit array_map() und array_unique() lässt sich das elegant lösen:

<?php

$emails = [
"Max@Beispiel.de",
"anna@beispiel.de",
"max@beispiel.de",
"ANNA@BEISPIEL.DE",
"peter@firma.de"
];

/* Alle auf Kleinbuchstaben normalisieren */
$normalisiert = array_map('strtolower', $emails);

/* Duplikate entfernen und neu indizieren */
$eindeutig = array_values(array_unique($normalisiert));
print_r($eindeutig);
?>

Ausgabe:

Array

(
[0] => max@beispiel.de
[1] => anna@beispiel.de
[2] => peter@firma.de
)

Durch die Kombination von strtolower() und array_unique() werden auch Duplikate erkannt, die sich nur in der Schreibweise unterscheiden. Das array_values() am Ende sorgt für lückenlose Indizes.

Mehrdimensionale Arrays: Duplikate finden

array_unique() arbeitet nur auf der ersten Ebene eines Arrays. Bei mehrdimensionalen Arrays versucht PHP die Sub-Arrays in Strings umzuwandeln, was nicht zum gewünschten Ergebnis führt. Mit dem Flag SORT_REGULAR lassen sich identische Sub-Arrays aber korrekt erkennen:

<?php

$produkte = [
["name" => "Laptop", "preis" => 999],
["name" => "Maus", "preis" => 29],
["name" => "Laptop", "preis" => 999],
["name" => "Tastatur", "preis" => 79]
];

$eindeutig = array_values(
array_unique($produkte, SORT_REGULAR)
);
print_r($eindeutig);
?>

Ausgabe:

Array

(
[0] => Array
(
[name] => Laptop
[preis] => 999
)
[1] => Array
(
[name] => Maus
[preis] => 29
)
[2] => Array
(
[name] => Tastatur
[preis] => 79
)
)

Das dritte Element (das doppelte Laptop) wurde erkannt und entfernt. SORT_REGULAR vergleicht die Sub-Arrays strukturell, sodass nur wirklich identische Einträge als Duplikate gelten.

Performance-Alternative: array_flip()

Bei sehr großen Arrays (mehrere tausend Einträge) kann array_unique() langsam werden, weil die Funktion intern sortiert. Eine schnellere Alternative ist der Trick mit array_flip():

<?php

$gross = ["a", "b", "c", "a", "d", "b", "e"];

/* Schnelle Deduplizierung */
$eindeutig = array_keys(array_flip($gross));
print_r($eindeutig);
/* Array ( [0] => a [1] => b [2] => c [3] => d [4] => e ) */
?>

array_flip() vertauscht Schlüssel und Werte. Da Schlüssel in PHP eindeutig sein müssen, werden Duplikate automatisch überschrieben. Mit array_keys() holt man anschließend die eindeutigen Werte zurück. Diese Methode funktioniert allerdings nur mit Strings und Integers als Werten, da nur diese als Array-Schlüssel erlaubt sind.

Häufigkeit zählen mit array_count_values()

Manchmal will man nicht nur wissen, welche Werte doppelt sind, sondern auch wie oft sie vorkommen. Dafür gibt es array_count_values():

<?php

$tags = ["php", "mysql", "php", "javascript", "php", "mysql"];

$haeufigkeit = array_count_values($tags);
print_r($haeufigkeit);
/* Array ( [php] => 3 [mysql] => 2 [javascript] => 1 ) */

/* Nur Tags mit mehr als einem Vorkommen */
$duplikate = array_filter(
$haeufigkeit,
function($count) { return $count > 1; }
);
print_r($duplikate);
/* Array ( [php] => 3 [mysql] => 2 ) */
?>

Während array_unique() Duplikate einfach entfernt, gibt array_count_values() einen Überblick über die Verteilung. Zusammen mit array_filter() lassen sich gezielt nur die mehrfach vorhandenen Werte herausfiltern.

Verwandte Tutorials

Das Bereinigen von Arrays ist nur ein Aspekt der Array-Verarbeitung in PHP. Diese Tutorials behandeln verwandte Themen:

Häufige Fragen zu array_unique()

Die folgenden Fragen klären typische Unsicherheiten beim Einsatz von array_unique().

Ist array_unique() case-sensitive?

Ja, array_unique() unterscheidet Groß- und Kleinschreibung. "PHP" und "php" gelten als verschiedene Werte. Für eine case-insensitive Deduplizierung die Werte zuerst mit array_map('strtolower', $array) normalisieren und dann array_unique() anwenden.

Was passiert mit assoziativen Arrays?

array_unique() funktioniert auch mit assoziativen Arrays. Die Schlüssel bleiben erhalten. Bei Duplikaten wird der erste Schlüssel-Wert-Paar behalten, alle späteren Vorkommen desselben Wertes werden entfernt, unabhängig vom Schlüssel.

Kann man die Reihenfolge der Elemente beeinflussen?

array_unique() behält immer das erste Vorkommen eines Wertes. Die Reihenfolge des Eingabe-Arrays bestimmt also, welches Element überlebt. Mit array_reverse() vor array_unique() kann man stattdessen das letzte Vorkommen behalten.

Wie erkennt man mit var_dump(), ob Duplikate entfernt wurden?

Ein Vergleich der Array-Längen vorher und nachher zeigt, ob Duplikate gefunden wurden: count($original) !== count(array_unique($original)). Für eine detaillierte Ausgabe der Struktur eignet sich var_dump(), das auch die Datentypen der einzelnen Werte anzeigt.

 

Tags:

 

Bücherregal mit drei Büchern: 'PHP 4 - Grundlagen und Profiwissen' von Hanser Verlag, 'Webdesign in a Nutshell' von O'Reilly Verlag, und 'Webgestaltung' von Galileo Computing.