Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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]

Geschrieben

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]

Geschrieben

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.

Geschrieben (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 von raven3k
Geschrieben (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 von raven3k
Geschrieben

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

Geschrieben

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.

Geschrieben

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]

Geschrieben
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.

Geschrieben

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]

Geschrieben

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.

Geschrieben (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...

preview.png

Schonmal Vielen Dank für Eure Hilfe!

Bearbeitet von raven3k
Geschrieben
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.

Geschrieben
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?

Geschrieben

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.

Geschrieben
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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...