thomasxyz
Goto Top

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

Content-Key: 333985

Url: https://administrator.de/contentid/333985

Printed on: April 25, 2024 at 01:04 o'clock

Member: SlainteMhath
SlainteMhath Apr 03, 2017 at 12:44:53 (UTC)
Goto Top
Moin,

ich weis nicht ob ich dich richt verstanden habe... trotzdem ein Versuch mit Pseudo-Code
for each $t in $teile {
  for each $a in explode($t,",") {  
    $a_tmp=$a
  }
}
$ausgabe=sort(unique($a_tmp));

lg,
Slainte
Mitglied: 132692
132692 Apr 03, 2017 updated at 12:48:31 (UTC)
Goto Top
$array = array("","U,I","A,V,I");  
$all = array_filter(array_unique(explode(",",implode(",",$array))));  
sort($all);
$ausgabe = implode(",",$all);  
echo $ausgabe;
Ausgabe: A,I,U,V

Gruß p.
Member: ThomasXYZ
ThomasXYZ Apr 03, 2017 at 12:48:34 (UTC)
Goto Top
Das sieht schon einmal viel versprechend aus! Ich werde es mal testen und mich gleich zurückmelden.
Member: ThomasXYZ
ThomasXYZ Apr 03, 2017 updated at 12:56:24 (UTC)
Goto Top
Also die Lösung sollte, blöd aneinandergereiht, so lauten: U, I, A, V, I
Sortiert so: A, V, U, I, I
Und doppelte Zeichen gelöscht so: A, V, U, I

Dein Ergebnis bringt für die selbe Zeile I, V,A,U raus. Wobei ich dort aus der Sortierung nicht schlau werde, wie die zustande gekommen ist... :-$

Ich habe deinen Code folgendermaßen angepasst:
$array = array($teil[1],$teil[2],$teil[3]); 
$all = array_filter(array_unique(explode(",",implode(",",$array))));   
sort($all); 
echo implode(",",$all);  
Mitglied: 132692
132692 Apr 03, 2017 updated at 13:00:43 (UTC)
Goto Top
Dein Ergebnis bringt für die selbe Zeile I, V,A,U raus.
Nö bei mir nicht. Oder hast du Leerzeichen zwischen den Kommas?
Member: ThomasXYZ
ThomasXYZ Apr 03, 2017 updated at 13:01:31 (UTC)
Goto Top
Ja habe ich...

Mein Problem dabei ist, dass nicht alphabetisch sondern "individuell" sortiert werden soll. Also erst das A, dann V, dann U, dann I.....
Mitglied: 132692
132692 Apr 03, 2017 at 13:01:34 (UTC)
Goto Top
Dann musst du die raus "trimmen".
Member: ThomasXYZ
ThomasXYZ Apr 03, 2017 at 13:02:36 (UTC)
Goto Top
Okay...

Und wie bekomme ich eine individuelle Sortierung hin?
Mitglied: 132692
Solution 132692 Apr 03, 2017 updated at 13:07:05 (UTC)
Goto Top
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;
Member: ThomasXYZ
ThomasXYZ Apr 03, 2017 updated at 13:12:58 (UTC)
Goto Top
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?
Mitglied: 132692
132692 Apr 03, 2017 updated at 14:00:01 (UTC)
Goto Top
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 ...
Aber anscheinend besteht ja kein Bedarf mehr, Beitrag ist ja gelöst?!

Na denn ciao
Gruss p.
Member: ThomasXYZ
ThomasXYZ Apr 03, 2017 updated at 14:33:31 (UTC)
Goto Top
Naja, meine Sortierung habe ich genannt. usort() habe ich mir bereits angeschaut. Da steige ich leider nicht so ganz durch im Moment.

Da der Button, "Zur Lösung beigetragen" irreführend ist, ist der Beitrag nun gelöst. Ist er aber nicht, da die Ausgabe noch die falsche Reihenfolge hat.
Mitglied: 132692
Solution 132692 Apr 03, 2017 updated at 14:58:10 (UTC)
Goto Top
Zitat von @ThomasXYZ:

Naja, meine Sortierung habe ich genannt.
Ja, aber ich erkenne an A,V,U,I nun überhaupt kein Muster nachdem ich einen Algorithmus schreiben könnte! face-sad

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.
Member: ThomasXYZ
ThomasXYZ Apr 04, 2017 at 06:07:15 (UTC)
Goto Top
Das hat mein Problem gelöst! Es funktioniert perfekt. Besten Dank.

Die Sortierung ist ja nicht von mir vorgegeben, sondern der eines RACI-Modells. Dort gibt es die Buchstaben R, A, C, I und die sind bei uns umbenannt in A, V, U, I und müssen in der Reihenfolge unbedingt vorkommen. V, U, I oder A, U, I sind auch möglich. Die Reihenfolge ist wichtig.

Ich habe mir usort() angeschaut und mir deiner Erklärung und deinem Code glaube ich auch versanden. face-smile

Vielen vielen Dank!