Doppelte Einträge aus mehrdimensionalem Array entfernen
Tolwin
- php
Hallo Forum,
kann mir jemand sagen wie ich einen oder mehrere doppelte Einträge aus einem mehrdimensionalem Array löschen kann? mit array_unique()
geht das ja nur bei eindimensionalen ...
Hier eine beispielhafte Ausgabe des Arrays per print_r()
Array
(
[0] => stdClass Object
(
[date_german] => 27.06.06
[id] => 902
[news_nummer] => 778
[titel] => Rabattaktion bis 3. Juli
[text] => Vom 23.-28.06.2006 gibt es 15%+5% ..
[category_id] => 262
[category_name] => Termine
)
[1] => stdClass Object
(
[date_german] => 15.03.06
[id] => 896
[news_nummer] => 773
[titel] => Wichtige Termin in 2006
[text] => Unter folgendem Link sind die
[category_id] => 262
[category_name] => Termine
)
[2] => stdClass Object
(
[date_german] => 07.02.05
[id] => 806
[news_nummer] => 702
[titel] => Anzeige von ...
[text] => Angebote, die Sie in 2004 im...
[category_id] => 244
[category_name] => Aktuelle Nachrichten
)
Es sollen nun alle Einträge mit gleichem Titel gelöscht werden.
Hat jemand eine Tipp?
Danke und Grüße
Tolwin
echo $begrüßung;
kann mir jemand sagen wie ich einen oder mehrere doppelte Einträge aus einem mehrdimensionalem Array löschen kann?
Arrays unter PHP sind Baumstrukturen.
Mein Vorschlag wäre: Erzeuge zuerst ein Array mit den gleichen Keys des originalen Arrays und nur einem skalaren Wert. Zur Not kann von komplexen Strukturen ein Hashwert gebildet werden.
Dieses Array wird dupliziert. Eins davon kannst du mit array_unique() bearbeiten, wenn die Keys erhalten bleiben. Dann ermittelst du die Unterschiede zwischen beiden Arrays (dafür gibt es auch Funktionen). Mit diesen Keys kannst du dann auf das originale Array zugreifen.
echo "$verabschiedung $name";
Mein Vorschlag wäre: Erzeuge zuerst ein Array mit den gleichen Keys des originalen Arrays und nur einem skalaren Wert. Zur Not kann von komplexen Strukturen ein Hashwert gebildet werden.
Dieses Array wird dupliziert. Eins davon kannst du mit array_unique() bearbeiten, wenn die Keys erhalten bleiben. Dann ermittelst du die Unterschiede zwischen beiden Arrays (dafür gibt es auch Funktionen). Mit diesen Keys kannst du dann auf das originale Array zugreifen.
Hättest Du evtl. ein kurzes Code-Beispiel für mich ?
Danke und Gruß
Tolwin
echo $begrüßung;
Hättest Du evtl. ein kurzes Code-Beispiel für mich ?
Nein, aber ich habe noch einen einfacheren Lösungweg gefunden. array_filter() ist für solche Fälle vorgesehen. Du schreibst dir eine Callback-Funktion, die true (Wert erhalten) oder false (Wert löschen) zurückgibt. Diese Funktion muss sich nur merken, ob ein bestimmter Wert bereits vorkam oder nicht. Dies kann sie in einem globalen Array (einfacher zu realisieren) tun oder in einem statischen lokalen (eleganter).
Bei dem statischen lokalen Array ist zu beachten: Die Callback-Funktion wird immer wieder neu aufgerufen. Variablen bleiben zwischen den Aufrufen nur dann erhalten, wenn sie als static deklariert werden (static $var = array();). Sollen mehrere Arrays gefiltert werden, muss noch ein Mechanismus zum Löschen der zwischengespeicherten Werte eingefügt werden. Dazu wird die Callback-Funktion entgegen der für array_filter() notwendigen Deklaration eines Parameter noch ein zweiter hinzugefügt, dessen Defaultwert im Verlauf der Funktion keine Aktion veranlasst. array_filter() bedient nur den ersten Parameter, so dass der zweite den Defautwert behält. Ruft man callback() zu Fuß auf und setzt den zweiten Parameter, kann man das als Signal zum Löschen des Zwischenspeichers nehmen. Hierfür gibts allerdings ein kleines Codebeispiel:
function callback($value, $reset = false) {
static $cache = array();
// Cache löschen
if ($reset) {
$cache = array();
return;
}
// array_filter()-Teil
if (in_array($value->..., $cache)
return false;
$cache[] = $value->...;
return true;
}
Der bessere Weg ist aber, wie Sven erwähnte, die Filterung der Datenquelle zu überlassen.
echo "$verabschiedung $name";
Vielen Dank für die ausführliche Beschreibung!
Viele Grüße
Tolwin
Moin!
kann mir jemand sagen wie ich einen oder mehrere doppelte Einträge aus einem mehrdimensionalem Array löschen kann?
Du HAST KEIN mehrdimensionales Array. Du hast ein eindimensionales Array von Objekten. Das ist ein UNTERSCHIED!!!111elf!
Es sollen nun alle Einträge mit gleichem Titel gelöscht werden.
Die SQL-Abfrage passend formulieren wäre schlau.
- Sven Rautenberg
Es sollen nun alle Einträge mit gleichem Titel gelöscht werden.
Die SQL-Abfrage passend formulieren wäre schlau.
Stimmt, das sind Objekte....
Habe es auch schon mit DISTINCT versucht, ist aber leider nicht
möglich, da das Array noch mit weiteren Daten aus einem Flatfile ergänzt wird. Gibts evtl. noch eine andere Möglichkeit?
Danke und Gruß
Tolwin
Moin!
Habe es auch schon mit DISTINCT versucht, ist aber leider nicht möglich, da das Array noch mit weiteren Daten aus einem Flatfile ergänzt wird.
Na und?
Gibts evtl. noch eine andere Möglichkeit?
Es gibt sogar mehrere. Aber du bist ja so schweigsam, was deine bisherige Vorgehensweise angeht.
- Sven Rautenberg