PHP - unique-array() und sort()
Hallo zusammen,
ich bin gerade leicht am verzweifeln und finde nicht so recht die Lösung.
Ich bekomme per Datenbankabfrage ein Array ausgeliefert. Das wäre am konkreten Beispiel $teil[ ] (gefüllt mit - [5]).
Mein Ziel ist es, dass $teil[1] - $teil[3] zusammengeführt wird, jeder Wert nur einmal vorhanden ist und nach einer bestimmten Regel sortiert ist.
Folgendes Beispiel habe ich:
$teil[1] = "";
$teil[2] = "U, I";
$teil[3] = "A, V, I";
Die Variablen $teil[ ] habe ich hier an dem Beispiel mal direkt definiert. Sie kommen sonst direkt per DB-Abfrage so heraus. Wie man sieht, ist $teil = NULL. Teil 2 und 3 sind gefüllt, enthalten aber auch doppelte Einträge. Die gilt es zu löschen. Danach soll es in folgende Reihenfolge gebracht werden, sodass in diesem Beispiel ein
$ausgabe = "A, V, U, I"
herauskommt. Das soll immer das Ergebnis sein. Es kann auch mal sein, dass $ausgabe mal kein A oder kein V beinhaltet. Hauptsache diese Reihenfolge, mit Komma getrennt, wird eingehalten.
Ich hoffe ihr versteht mich und könnt mir irgendwie weiterhelfen...
Gruß
ThomasXYZ
ich bin gerade leicht am verzweifeln und finde nicht so recht die Lösung.
Ich bekomme per Datenbankabfrage ein Array ausgeliefert. Das wäre am konkreten Beispiel $teil[ ] (gefüllt mit - [5]).
Mein Ziel ist es, dass $teil[1] - $teil[3] zusammengeführt wird, jeder Wert nur einmal vorhanden ist und nach einer bestimmten Regel sortiert ist.
Folgendes Beispiel habe ich:
$teil[1] = "";
$teil[2] = "U, I";
$teil[3] = "A, V, I";
Die Variablen $teil[ ] habe ich hier an dem Beispiel mal direkt definiert. Sie kommen sonst direkt per DB-Abfrage so heraus. Wie man sieht, ist $teil = NULL. Teil 2 und 3 sind gefüllt, enthalten aber auch doppelte Einträge. Die gilt es zu löschen. Danach soll es in folgende Reihenfolge gebracht werden, sodass in diesem Beispiel ein
$ausgabe = "A, V, U, I"
herauskommt. Das soll immer das Ergebnis sein. Es kann auch mal sein, dass $ausgabe mal kein A oder kein V beinhaltet. Hauptsache diese Reihenfolge, mit Komma getrennt, wird eingehalten.
Ich hoffe ihr versteht mich und könnt mir irgendwie weiterhelfen...
Gruß
ThomasXYZ
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 333985
Url: https://administrator.de/forum/php-unique-array-und-sort-333985.html
Ausgedruckt am: 06.05.2025 um 00:05 Uhr
14 Kommentare
Neuester Kommentar

$array = array("","U,I","A,V,I");
$all = array_filter(array_unique(explode(",",implode(",",$array))));
sort($all);
$ausgabe = implode(",",$all);
echo $ausgabe;
Gruß p.

Dein Ergebnis bringt für die selbe Zeile I, V,A,U raus.
Nö bei mir nicht. Oder hast du Leerzeichen zwischen den Kommas?
Dann musst du die raus "trimmen".

Wie wärs mal ab und zu mit minimal Doku lesen ...
$array = array("","U, I","A, V, I");
$all = array_filter(array_unique(array_map('trim',explode(",",implode(",",$array)))));
sort($all);
$ausgabe = implode(",",$all);
echo $ausgabe;

Zitat von @ThomasXYZ:
Ich sehe den Wald vor lauter Bäumen nicht.
Ich verstehe gerade irgendwie nicht, wie ich das Ganze nun manuell sortieren kann. Kannst du mir das bitte evtl. an meinem Beispiel zeigen?
usort ist dein Freund wenn du eigene Sortierroutinen haben willst, du schreibst ja leider nicht das Konzept hinter deiner Sortierung, da kann man auch kein Beispiel machen ...Ich sehe den Wald vor lauter Bäumen nicht.
Ich verstehe gerade irgendwie nicht, wie ich das Ganze nun manuell sortieren kann. Kannst du mir das bitte evtl. an meinem Beispiel zeigen?
Aber anscheinend besteht ja kein Bedarf mehr, Beitrag ist ja gelöst?!
Na denn ciao
Gruss p.

Ja, aber ich erkenne an A,V,U,I nun überhaupt kein Muster nachdem ich einen Algorithmus schreiben könnte! 
Ist es größer gibst du aus der Function eine 1 zurück, ist es kleiner eine -1.
Du gibst also deinen X Werten jeweils einen festen Wert in der Reihenfolge die du haben willst und vergleichst diese per IF miteinander. Sieh dir die Beispiele auf der Seite an, da ist das ja ganz anschaulich erläutert worden.
usort() habe ich mir bereits angeschaut. Da steige ich leider nicht so ganz durch im Moment.
Ganz einfach du machst dir eine custom sort function und in der Function entscheidest du per IF Abfrage ob ein Element größer oder kleiner als das andere ist.Ist es größer gibst du aus der Function eine 1 zurück, ist es kleiner eine -1.
Du gibst also deinen X Werten jeweils einen festen Wert in der Reihenfolge die du haben willst und vergleichst diese per IF miteinander. Sieh dir die Beispiele auf der Seite an, da ist das ja ganz anschaulich erläutert worden.
function cmp($a, $b)
{
$values = array('A' => 1,'V' => 2, 'U' => 3,'I' => 4);
return ($values[$a] < $values[$b]) ? -1 : 1;
}
$array = array("","U, I","A, V, I");
$all = array_filter(array_unique(array_map('trim',explode(",",implode(",",$array)))));
usort($all,'cmp');
$ausgabe = implode(",",$all);
echo $ausgabe;
Da der Button, "Zur Lösung beigetragen" irreführend ist, ist der Beitrag nun gelöst.
Kannst du rückgängig machen, Beitrag bearbeiten und unten den Haken weg machen.