Doppelte Einträge in Array per Funktion löschen
Tolwin
- php
Hallo Forum,
dedlfix hatte mir den Hinweis gegeben dass das Löschen doppelter Einträge in einem Array per Callback-Funktion möglich sei. Da ich
bisher noch kaum bis garnicht mit Funktionen (selbstgeschriebenen) gearbeitet habe, sonder eher der Spaghetti-Code Programmierer bin =)
habe ich so meine Probleme mit der nachfolgenden Funktion:
Funktion um true bei doppelten Vorkommen zu returnen
function doppelte_filter($value, $reset = false){
static $cache = array();
if($reset){
$cache = array();
return;
}
if (in_array($value->id, $cache)){
return false;
$cache[] = $value->id;
return true;
}
}
Hier durchlaufe ich das Result Array aus der Datenbank und pushe b
if(doppelte_filter($result_array[$db_key])){
array_push($array_result, $result_array[$db_key]);
$counting++;
}
Und hier ein Auszug aus $result_array per print_r()
Array
(
[0] => stdClass Object
(
[date_german] => 15.03.06
[id] => 896
[news_nummer] => 773
[titel] => Wichtige Termin in 2006
[text] => Unter folgendem Link sind die Termine 2006...
[category_id] => 262
[category_name] => Termine
[path] =>
[sort] =>
)
[1] => stdClass Object
(
[date_german] => 07.02.05
[id] => 806
[news_nummer] => 702
[titel] => Anzeige von Angeboten aus 2004
[text] => Angebote, die Sie in 2004 im alten
[category_id] => 244
[category_name] => Aktuelle Nachrichten
[path] => StudentenBanking, Aktuelle Nachrichten
[sort] => 12
)
[2] => stdClass Object
(
[date_german] => 28.09.04
[id] => 782
[news_nummer] => 679
[titel] => Wir sind soweit
[text] => Dies ist ein Blindtext.
[category_id] => 226
[category_name] => Aktuelle Nachrichten
[path] => Aktuelles - de
[sort] => 7
)
}
Grundsätzlich möchte ich das doppelte Vorkommen einer [id] nachträglich vermeiden. Nach mehrfachen Versuchen dies über das
SQL Statement zu realisieren (UNION, DISTINCT, EXISTS) musste
ich feststellen, dass es nur über die Nachbearbeitung per PHP geht.
Was genau mache ich falsch?
Vielen Dank und viele Grüße
Tolwin
echo $begrüßung;
dedlfix hatte mir den Hinweis gegeben dass das Löschen doppelter Einträge in einem Array per Callback-Funktion möglich sei.
Ja, aber eine Callback-Funktion ist dazu da, um von einer anderen Funktion aufgerufen zu werden. In deinem Fall wäre das array_filter().
(Es ging übrigens um diese Aufgabenstellung: </archiv/2006/6/t132169/>
Das ist die Callback-Funktion:
function doppelte_filter($value, $reset = false){
static $cache = array();
Die muss einmalig aufgerufen werden, um den internen Cache zu löschen. (Beim allerersten Mal kann man sich das schenken, aber schaden tut es auch nicht.)
doppelte_filter(null, true);
Hier durchlaufe ich das Result Array aus der Datenbank [...]
Das Durchlaufen macht array_filter(), dabei ruft es für jeden Wert aus dem übergebenen Array die Callback-Funktion auf, die dann für diesen Wert Daumen hoch oder runter entscheidet.
$unique_array = array_filter($result_array, 'doppelte_filter');
echo "$verabschiedung $name";
$unique_array = array_filter($result_array, 'doppelte_filter');
Hallo Dedlfix,
Kann ich davon ausgehen dass der Rest meiner Funktion richtig ist, ich sie aber nur falsch aufgerufen habe?
function doppelte_filter($value, $reset = false){
static $cache = array();
if($reset){
$cache = array();
return;
}
if (in_array($value->id, $cache)){
return false;
$cache[] = $value->id;
return true;
}
}
$unique_array = array_filter($array_result, doppelte_filter());
print_r($unique_array);
??? da bekomme ich eine Fehlermeldung syntax error, unexpected T_STRING
Für was steht denn $value->? Ich war der Meinung hier das Array mit den zu filternden Objekt zu übergeben "doppelte_filter($result_array)" um in der Funktion dann auf das Objekt id "$value->id" im Array zugriff zu haben... oder verstehe ich da was falsch?
sorry das ich so schwer von kp bin. Danke und Gruß
Tolwin
echo $begrüßung;
Kann ich davon ausgehen dass der Rest meiner Funktion richtig ist, ich sie aber nur falsch aufgerufen habe?
Die Funktion doppelte_filter() ist soweit richtig.
$unique_array = array_filter($result_array, 'doppelte_filter');
$unique_array = array_filter($array_result, doppelte_filter());
Von der Callback-Funktion ist nur der Name als String zu übergeben, so wie in der oberen Zeile.
echo "$verabschiedung $name";
Von der Callback-Funktion ist nur der Name als String zu übergeben, so wie in der oberen Zeile.
Ah ja, habs angepasst .. danke.
Jetzt bekomme ich $unique_array mit print_r() leer angezeigt.
Aber laut Beschreibung auf PHP.net müsste es so funktionieren.
fehlt noch etwas?
Nochmals vielen Dank für die Gedult!
Grüße
Tolwin
echo $begrüßung;
Jetzt bekomme ich $unique_array mit print_r() leer angezeigt.
fehlt noch etwas?
Ah, da ist doch ein Fehler drin.
function doppelte_filter($value, $reset = false){
static $cache = array();
if($reset){
$cache = array();
return;
}
if (in_array($value->id, $cache)){
return false;
Das if (in_array...) hat nur die eine Anweisung auszuführen: return false;
Die {}-Klammern sind alse entweder wegzulassen oder nur um dieses return zu setzen.
Die nächsten beiden Zeilen gehören sozusagen in den else-Zweig des obigen if. Es muss hier nur kein else-Zweig notiert werden, da bei erfüllter Bedingung die Funktion beendet wird, und man bei nicht erfüllter Bedingung - mit oder ohne else - auf eindeutigem Wege hier vorbeikommen.
$cache[] = $value->id;
return true;
}
}
echo "$verabschiedung $name";
Super, das wars gewesen ... Vielen Dank dedlfix!!!
Grüße
Tolwin