raven3k Geschrieben 3. März 2011 Geschrieben 3. März 2011 Sitze momentan an einem wichtigen Projekt und versuche momentan ein Array nach Benutzervorgaben zu sortieren. Habe momentan 2 Spalten, in der Linke eine Zahl und rechts daneben den Key des Arrays. Nun wollte ich das man die Zahl verändern kann, z.B aus 0 - 1 - 2 dann 1 - 0 - 2 und mir das Script es dann in der richtigen Reihenfolge sortiert. Vielleicht ist mein Ansatz ja auch schon falsch und evtl. hat ja jemand auch eine Idee wie ich es hinbekomme, das ich ein Assoziatives Array individuell sortieren kann... Mal ein Beispiel von einem Array und die Keys mit Values sollen halt eine andere Reihenfolge erhalten. array(1) { ["sql"]=> array(2) { [0]=> array(3) { ["Tolle Bezeichnung"]=> NULL ["Kategoriename"]=> string(36) "Betriebssysteme / Netzwerk Microsoft" ["preis"]=> string(7) "1980.00" } [1]=> array(3) { ["Tolle Bezeichnung"]=> NULL ["Kategoriename"]=> string(36) "Betriebssysteme / Netzwerk Microsoft" ["preis"]=> string(7) "1980.00" } } }[/PHP] Zitieren
etreu Geschrieben 3. März 2011 Geschrieben 3. März 2011 Was soll denn in deinem Beispiel geändert werden? Du kennst schon die die array-Funktionen von PHP? Zitieren
raven3k Geschrieben 3. März 2011 Autor Geschrieben 3. März 2011 eigentlich kenn ich schon so einige array funktionen... aber wohl irgendwie heute nicht ganz bei der sache aber wie gesagt ich will ja nicht das [0-n] umstellen sondern [sql][0-n][key] Bitte gebt mir nur einen kleinen tipp, beim phpforum frag ich erst garnicht. Da wurd ich gestern schon sowas von ausgelacht wegen dem Umbenennen eines ArrayKeys, dabei isses durchaus relevant für mein Projekt. Beispiel wie es dann nach der Sortierung ausschauen sollte... [PHP]array(1) { ["sql"]=> array(2) { [0]=> array(3) { ["Kategoriename"]=> string(36) "Betriebssysteme / Netzwerk Microsoft" ["Tolle Bezeichnung"]=> NULL ["preis"]=> string(7) "1980.00" } [1]=> array(3) { ["Kategoriename"]=> string(36) "Betriebssysteme / Netzwerk Microsoft" ["Tolle Bezeichnung"]=> NULL ["preis"]=> string(7) "1980.00" } } } [/PHP] Zitieren
etreu Geschrieben 3. März 2011 Geschrieben 3. März 2011 Soweit ich mich erinnere sind assoziative Arrays unsortiert. Sie Schlüssel treten in der Reihenfolge auf, wie sie eingefügt werden. Um die Schlüssel sortiert zu bekommen, kannst du eine Liste mit der Sortierung pflegen. Dieses Array verwendest du in einer eigenen Sortierfunktion, die über uksort() (PHP: uksort - Manual) alle Items deines "sql"-Arrays verarbeitet. Zitieren
raven3k Geschrieben 3. März 2011 Autor Geschrieben 3. März 2011 (bearbeitet) dacht ja schon an eine JavaScript Lösung, aber bisher auch noch nichts brauchbares gefunden. Das ich die Spalten anzeigen lassen und per Drag&Drop kann man die Reihenfolge damit festlegen und am ende ein neues Array erhalte. Oder andere Lösung wäre vielleicht, ich mach beim Array einen neuen Schlüssel rein mit der Zahl aus dem Input Feld, lass es anhand der Zahl dann sortieren und später das Array wieder umstellen. Die Form des Arrays sollte schon auf der gesamten Webseite gleich sein... Bearbeitet 3. März 2011 von raven3k Zitieren
etreu Geschrieben 3. März 2011 Geschrieben 3. März 2011 Du hast mich aber schon verstanden, oder? Zitieren
raven3k Geschrieben 3. März 2011 Autor Geschrieben 3. März 2011 (bearbeitet) Hatte dich schon in etwa verstanden, so ähnlich hab ich es nun auch vor... so in etwa stell ich es mir vor, dann sortieren lassen nach den Zahlen und danach das Array wieder umstellen... array(1) { ["sql"]=> array(2) { [0]=> array(3) { [2] => ["Kategoriename"]=> string(36) "Betriebssysteme / Netzwerk Microsoft" [0] => ["Tolle Bezeichnung"]=> NULL [1] => ["preis"]=> string(7) "1980.00" } [1]=> array(3) { [2] => ["Kategoriename"]=> string(36) "Betriebssysteme / Netzwerk Microsoft" [0] => ["Tolle Bezeichnung"]=> NULL [1] => ["preis"]=> string(7) "1980.00" } } }[/PHP] Bearbeitet 3. März 2011 von raven3k Zitieren
etreu Geschrieben 3. März 2011 Geschrieben 3. März 2011 Dieses Vorgehen hat verschiedene Nachteile: 1. Du mischt Informationen zur Visualisierung mit den Nutzdaten 2. Die Sortierinformationen liegen redundant vor 3. Du benötigst mehr Speicher 4. Du must eine weitere array()-Ebene einführen Zitieren
raven3k Geschrieben 3. März 2011 Autor Geschrieben 3. März 2011 jo kla, optimal is die Lösung nicht. Komme nur leider gerade nicht so wirklich dahinter, wie ich das am sinnvollsten Löse. Das Problem ist halt, das der User von dem Script die Reihenfolge anhand einer Vorgabe selber festlegen muss. Zitieren
_n4p_ Geschrieben 3. März 2011 Geschrieben 3. März 2011 und diese reihenfolge muss das script ja irgendwie übermittelt bekommen. am günstigsten wäre wenn du die eingabe des benutzers irgendwie in die form array { 0 => 'Tolle Bezeichnung', 1 => 'Kategoriename', 2 => 'preis' } transformieren könntest. dann läufst du mit 2 foreach über die arrays ksort($aSort); $aNewSQLs = array(); foreach ($aSQLs as $keySql => $aSQL) { foreach ($aSort as $val) { $aNewSQLs[$keySql][$val] = $aSQL[$val]; } } [/PHP] Zitieren
raven3k Geschrieben 3. März 2011 Autor Geschrieben 3. März 2011 jo das war ja auch schon ein ansatz von mir.... das mit usort dürfte aber auch irgendwie funktionieren, versuche mich da gerade schlau zu machen... Zitieren
etreu Geschrieben 3. März 2011 Geschrieben 3. März 2011 jo das war ja auch schon ein ansatz von mir.... das mit usort dürfte aber auch irgendwie funktionieren, versuche mich da gerade schlau zu machen... Deine Vergleichsfunktion bekommt die Schlüssel. In der Funktion ermittelst du die Position in der Liste für beide Schlüssel und gibst das Ergebnis des Vergleiches zurück. Zitieren
raven3k Geschrieben 3. März 2011 Autor Geschrieben 3. März 2011 mit array_keys werd ich wohl auch meinen Ziel näher kommen... Momentan folgende Ausgabe... // aus dem Input Feldern die Werte array(3) { ["Kat_Zuordnung"]=> string(1) "0" ["Kategoriename"]=> string(1) "2" ["Kursnr"]=> string(1) "1" } // die bisherige Sortierung, mit array_keys ermittelt array(3) { [0]=> string(13) "Kat_Zuordnung" [1]=> string(13) "Kategoriename" [2]=> string(6) "Kursnr" }[/PHP] Zitieren
etreu Geschrieben 3. März 2011 Geschrieben 3. März 2011 Ungetestet! $sortierung = array("x", "y","z"); function cmp_assoc($a, $ { $pos_a = array_search($a, $sortierung); $pos_b = array_search($b, $sortierung); if ($pos_a === FALSE && $pos_b === FALSE) { return 0; } else if ($pos_a === FALSE) { return -1; } else if ($pos_b === FALSE) { return 1; } else { return ($pos_b - $pos_a); } } foreach($data['sql'] as $key => $sql) { uksort($sql, 'cmp_assoc'); $data['sql'][$key] = $sql; } [/PHP] Wenn du die Sortierung änderst, dann must du nur Änderungen in $sortierung vornehmen und merken. Zitieren
raven3k Geschrieben 3. März 2011 Autor Geschrieben 3. März 2011 (bearbeitet) hab es momentan so gelöst und scheint wohl zu klappen... function cmp_assoc($a, $ { $sort = array(); foreach($_POST as $cnt => $val){ unset($_POST['Sortieren']); $sort[] .= $val; } $sortierung = $sort; $pos_a = array_search($a, $sortierung); $pos_b = array_search($b, $sortierung); if ($pos_a === FALSE && $pos_b === FALSE) { return 0; } else if ($pos_a === FALSE) { return -1; } else if ($pos_b === FALSE) { return 1; } else { return ($pos_b - $pos_a); } } foreach($_SESSION['sql'] as $key => $sql) { uksort($sql, 'cmp_assoc'); $_SESSION['sql'][$key] = $sql; } [/PHP] Preview der ganzen Oberfläche... Schonmal Vielen Dank für Eure Hilfe! Bearbeitet 3. März 2011 von raven3k Zitieren
_n4p_ Geschrieben 3. März 2011 Geschrieben 3. März 2011 Ungetestet! gut das du es sagst. so spontan die frage, woher kennt cmp_assoc $sortierung? hab es momentan so gelöst und scheint wohl zu klappen... zufall ... du nimmst alle POST daten und schiebst sie in $sort .. egal was da kommt. unset($_POST['Sortieren']); während du durch das POST array gehst ist mal richtig quark. $sortierung = $sort; - sinn? über array_search lass ich mich hier jetzt nich aus. waren die 7 zeilen einfach nur zu kryptisch oder war es zu effizient? ich geb zu das sie nicht "schön" ist, aber dieses uksort gehampel is echt zum lachen. Zitieren
etreu Geschrieben 3. März 2011 Geschrieben 3. März 2011 gut das du es sagst. so spontan die frage, woher kennt cmp_assoc $sortierung? Als globales Array zur Verdeutlichung der Funktionalität. über array_search lass ich mich hier jetzt nich aus. Alternativen? ich geb zu das sie nicht "schön" ist, aber dieses uksort gehampel is echt zum lachen. - Warum sortierst du die Schlüssel nach denen sortiert werden soll? - Modularität?! (Oder jedes mal den Code kopieren?) u*sort() einfach mal als pädagogische Einheit für diesen Tag. Genau dafür sind Funktionen da und warum nicht ein einem einfachen Beispiel zeigen? Zitieren
raven3k Geschrieben 3. März 2011 Autor Geschrieben 3. März 2011 in dem formular sind ja ausser den Zahlen auch der Wert von dem Submit Button drin, das hau ich mit unset erstmal sofort raus... auch wenn es auf die Sortierung keinen großen Einfluss haben wird. Wenn du eine bessere Lösung hast, kannst du es uns ja gerne mitteilen... So richtig perfekt, scheint die Suche auch noch nicht zu funktionieren. Zitieren
_n4p_ Geschrieben 3. März 2011 Geschrieben 3. März 2011 Als globales Array zur Verdeutlichung der Funktionalität. davon steht da aber nix, zumindest seh ich nichts. Alternativen? das array mit der reihenfolge, genau andersrum aufbauen und dann nach werten sortieren. dann könnte man einfach per $sortierung['preis'] den index bestimmen. - Warum sortierst du die Schlüssel nach denen sortiert werden soll? weil ich das array in der form verarbeite wie ich es dargestellt habe, und nicht davon ausgehe das die reihenfolge der keys aufsteigend ist. lege ich das array testweise einfach so an $aSort = array(2 => 'Tolle Bezeichnung', 0 => 'Kategoriename', 1 => 'preis' ); [/PHP] erhalte ich auch genau diese eihenfolge [code] Array ( [2] => Tolle Bezeichnung [0] => Kategoriename [1] => preis ) [/code] - Modularität?! (Oder jedes mal den Code kopieren?) hmm .. is dein ernst oder? meiner meinung nach sollte man sich schon kurzzeitig mit der lösung beschäftigen um solche schnipsel an die eigenen anforderunen anzupassen. und ob er das nun in eine methode oder eine funktion packen möchte überlasse ich ihm, da der teil für das problem an sich unerheblich ist. u*sort() einfach mal als pädagogische Einheit für diesen Tag. Genau dafür sind Funktionen da und warum nicht ein einem einfachen Beispiel zeigen? weil man globale variablen vermeiden sollte. ja kann man hier umgehen indem man alles in eine klasse baut. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.