2-dimensionales Array alphabetisch sortieren
Eddie
- php
Hallo allerseits,
Ich moechte folgendes Beispiel-Array alphabetisch sortieren, und zwar nach 'urlName':
$test = array(array( 'plainName' => 'Ägypten',
'htmlName' => 'Ägypten',
'urlName' => 'Aegypten'
),
array( 'plainName' => 'Libyen / Libysch-Arabische Dschamahirija',
'htmlName' => 'Libyen / Libysch-Arabische Dschamahirija',
'urlName' => 'Libyen-oder-Libysch-Arabische-Dschamahirija'
),
array( 'plainName' => 'Algerien',
'htmlName' => 'Algerien',
'urlName' => 'Algerien'
),
array( 'plainName' => 'Marokko',
'htmlName' => 'Marokko',
'urlName' => 'Marokko'
)
);
Im Ergebnis waeren also die beiden Unterarrays für Libyen und Algerien vertauscht.
Wie geht das?
Danke für eure Hilfe,
Eddie
Hallo Martin,
Hallo allerseits,
Ich moechte folgendes Beispiel-Array alphabetisch sortieren, und zwar nach 'urlName':
[...]
Wie geht das?
Probier's mal mit http://php4.globe.de/manual/de/function.array-multisort.php.
Grüsse
Frankie
Hello,
$test = array(array( 'plainName' => 'Ägypten',
'htmlName' => 'Ägypten',
'urlName' => 'Aegypten'
),
array( 'plainName' => 'Libyen / Libysch-Arabische Dschamahirija',
'htmlName' => 'Libyen / Libysch-Arabische Dschamahirija',
'urlName' => 'Libyen-oder-Libysch-Arabische-Dschamahirija'
),
array( 'plainName' => 'Algerien',
'htmlName' => 'Algerien',
'urlName' => 'Algerien'
),
array( 'plainName' => 'Marokko',
'htmlName' => 'Marokko',
'urlName' => 'Marokko'
)
);
Du machst Dir das Leben zu schwer.
nimm die Korrespondenz nicht in die Knoten, sondern in den Schlussindex
Und gewöhn Dir für die Darstellung eine andere Schreibweise an:
$_table['plainName'][1] = 'Ägypten';
$_table['plainName'][2] = 'Libyen / Libysch-Arabische Dschamahirija';
$_table['plainName'][3] = 'Algerien';
$_table['plainName'][4] = 'Marokko';
$_table['htmlName']['1'] = 'Ägypten';
$_table['htmlName']['2'] = 'htmlName' => 'Libyen / Libysch-Arabische Dschamahirija';
$_table['htmlName']['3'] = 'htmlName' => 'Algerien';
$_table['htmlName']['4'] = 'htmlName' => 'Marokko';
$_table['urlName']['1'] = 'Aegypten';
$_table['urlName']['2'] = 'Libyen-oder-Libysch-Arabische-Dschamahirija';
$_table['urlName']['3'] = 'urlName' => 'Algerien';
$_table['urlName']['4'] = 'Marokko';
Nun kannst Du nach jeder Spalte einfach mit
natcasesort($_table[$spaltenname]);
sortieren und dann die Spalte mit
foreach($_table[$spaltenname] as $key => val)
{
echo $_table['plainName'][$key]."<br />";
echo $_table['htmlName'][$key]."<br />";
echo $_table['urlName']['key']."<br />";
}
anzeigen lassen.
Die drei Zeilen innen kann man auch noch gegen ein
foreach(array_keys($_table) as $fieldname)
{
echo $_table[$fieldname][$key]."<br />";
}
austauschen.
Also:
foreach($_table[$spaltenname] as $key => val)
{
foreach(array_keys($_table) as $fieldname)
{
echo $_table[$fieldname][$key]."<br />";
}
}
Ich habe es jetzt nicht laufen lassen, könnte also noch ein Typo drinstecken...
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hello,
sorry, da waren schon welche.
$_table['plainName'][1] = 'Ägypten';
$_table['plainName']['1'] = 'Ägypten';
Aber es ist PHP egal, ob der numerische Index in Häkchen steht oder nicht. Kommt aufs gleiche raus, man merkt nur leider den Fehler nicht, wenn man mal versehetlich ein 'el' schreibt statt einer 'eins'
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo Tom,
nimm die Korrespondenz nicht in die Knoten, sondern in den Schlussindex
[...]
Eddie hat aber nicht danach gefragt, wie er sein Array aufbauen muss um es einfacher sortieren zu können, sondern vielmehr, wie er ein _bestehendes_ mehrdimensionalen Array nach einem Schlüssel seiner Wahl sortieren kann.
Grüsse
Frankie
Hello,
Eddie hat aber nicht danach gefragt, wie er sein Array aufbauen muss um es einfacher sortieren zu können, sondern vielmehr, wie er ein _bestehendes_ mehrdimensionalen Array nach einem Schlüssel seiner Wahl sortieren kann.
Hallo Eddie, entschuldige bitte, dass ich so eine falsche Antwort gegeben habe.
Lösch sie bitte sofort, damit Du dich nicht ärgern musst. ;-)
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi Tom :-)
Hallo Eddie, entschuldige bitte, dass ich so eine falsche Antwort gegeben habe.
Lösch sie bitte sofort, damit Du dich nicht ärgern musst. ;-)
Hey, seit wann verstossen denn falsche Antworten gegen die Forumsregeln? Meine Guete, hab ich ja garnicht mitgekriegt. Also liebe Administratoren, der Thread muss weg!
Ne, im Ernst, danke dir fuer die super ausfuehrliche Antwort! Zumindest gelernt hab ich was. Allerdings hatte Frankie schon recht, das Array existiert schon und ist so tief in meine Seite integriert, dass ich da leider garnichts mehr aendern kann. Ich schaetz mal, Frankie hat aus meiner Seitenstruktur geschlussfolgert, dass dem so sein muss.
Ist traurig aber wahr: manche Designentscheidungen verfolgen einen ein ganzes Projektleben lang. (...hoffentlich wird's lang sein, das Projektleben!... trotz der Probleme :-)
Jedenfalls habe ich es jetzt mit usort(...) geloest, erschien mir einfacher als array_multisort(...). Das Ergebnis (eine geordnete Laenderliste) gibt's hier: http://www.umdiewelt.de/Afrika/Reiseziel-2.html
Eddie
Moin!
Du machst Dir das Leben zu schwer.
Nein, die Arraystruktur ist der Aufgabe perfekt angepaßt.
nimm die Korrespondenz nicht in die Knoten, sondern in den Schlussindex
Warum dieses? Das macht das Sortieren doch nur unnütz schwer bis unmöglich!
Nun kannst Du nach jeder Spalte einfach mit
natcasesort($_table[$spaltenname]);
Das zerreißt die logischen Zusammenhänge zwischen den einzelnen Einträgen DEINES Arrays.
Eddies Array hingegen kann man mit usort() prima sortieren lassen - man muß nur eine passende Vergleichsfunktion schreiben.
sortieren und dann die Spalte mit
foreach($_table[$spaltenname] as $key => val)
{
echo $_table['plainName'][$key]."<br />";
echo $_table['htmlName'][$key]."<br />";
echo $_table['urlName']['key']."<br />";
}anzeigen lassen.
Warum läßt du im foreach $val erzeugen, wenn du es nicht nutzt?
Ich habe es jetzt nicht laufen lassen, könnte also noch ein Typo drinstecken...
Das Problem sind nicht die Typos, sondern der grundlegende Programmieransatz.
- Sven Rautenberg
Hello,
Warum läßt du im foreach $val erzeugen, wenn du es nicht nutzt?
Wie erzeugt man denn im Foreach $key, ohne dass $val erzeugt wird?
Ich habe es jetzt nicht laufen lassen, könnte also noch ein Typo drinstecken...
Das Problem sind nicht die Typos, sondern der grundlegende Programmieransatz.
Der ist super!
Wenn Du es nicht glaubst, dann musst Du dich mal mit den Programmierern von PHP auseinandersetzen. Die sind da nämlich durchaus meiner Meinung. Ein Beispiel findest Du übrigens auch unter $_FILES.
Ich hatte nämlich mal gefragt, warum das so "chaosmäßig" aufgebaut wäre und habe wohl ausnahmsweise mal einen Netten erwischt. Er hat mich aber "durch die Blume" als PHP-Laien bezeichnet, weil ich nicht sofort den Vorteil dieses Aufbaus gesehen habe. Das kannst Du Dir nun ersparen ;-))
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Moin!
Warum läßt du im foreach $val erzeugen, wenn du es nicht nutzt?
Wie erzeugt man denn im Foreach $key, ohne dass $val erzeugt wird?
Man benutzt $val einfach.
Das Problem sind nicht die Typos, sondern der grundlegende Programmieransatz.
Der ist super!
Nein, das ist vollkommen ernst gemeint.
Wenn Du es nicht glaubst, dann musst Du dich mal mit den Programmierern von PHP auseinandersetzen. Die sind da nämlich durchaus meiner Meinung. Ein Beispiel findest Du übrigens auch unter $_FILES.
Die Entgegennahme von Formulardaten ist etwas anderes, als das Erstellen und Verwalten eigener Daten im Array.
Ich hatte nämlich mal gefragt, warum das so "chaosmäßig" aufgebaut wäre und habe wohl ausnahmsweise mal einen Netten erwischt. Er hat mich aber "durch die Blume" als PHP-Laien bezeichnet, weil ich nicht sofort den Vorteil dieses Aufbaus gesehen habe. Das kannst Du Dir nun ersparen ;-))
Ich kann nur sagen: Der Mann hatte Recht.
Aber ich erkläre es dir (und Eddie und dem Rest der Welt) natürlich noch mal:
Gehen wir von "früher" aus: Wenn man da mehrere gleichnamige Formularfelder an PHP übergeben wollte, wurden die in HTML name="feldname[]" mit eckigen Klammern am Ende genannt, und PHP hat dann statt der gewöhnlichen Variablen $feldname ein Array $feldname angelegt, mit den Indizes [0]..[n] - je nachdem, wieviele Felder im Formular diesen Namen hatten.
Vorteil: Man kann einfach mit is_array($feldname) prüfen, ob arraymäßig Daten übergeben wurden (was auch bei einem einzigen Feld mit eckigen Klammern der Fall ist).
Dann kam die große register-globals-off-Revolution, und aus $feldname wurde $_POST['feldname']. Der Rest ist geblieben: Mehrfachfelder werden jetzt unter $_POST['feldname'][0..n] abgelegt.
Das gleiche passiert im Feld $_FILES. Die Bezeichnung aus dem name-Attribut taucht in der ersten Dimension wieder auf: $_FILES['feldname']. Da zu einem Dateiupload aber mehr gehört, als einfach nur einen einfachen String in dieser Variablen zu speichern, ist in diesem Arrayelement ein weiteres Array mit den Informationen zu Dateiname ['name'], Mimetyp ['type'], Größe ['size'], temporärem Dateinamen auf dem Server ['tmp_name'] und Fehlercode ['error'].
Werden in mehreren Dateiauswahlfeldern gleichen Namens (mit eckigen Klammern) mehrere Dateien hochgeladen, ist diese Tatsache wieder in der letzten Dimension des dann entstehenden Arrays zu finden. Man kann also einfach $_FILES['feldname']['tmp_name'] mit is_array() prüfen und weiß, ob man es mit mehreren Dateien oder nur mit einer zu tun hat. Die Vorgehensweise ist, auch im Vergleich zu $_POST (oder $_GET) vollkommen identisch. Und logisch.
Jetzt zu Eddies Problem: Da gibt es mehrere Datensätze gleichartigen Aufbaus, die sortiert werden sollen.
Dein Vorschlag war, zuerst die Bezeichnung des Feldes als Dimension zu wählen, und als zweite Dimension dann numeriert die Daten dieses Feldes.
Eddies Struktur ist genau umgekehrt: Die erste Dimension numeriert alle existierenden Datensätze durch, und die zweite Dimension unterscheidet dann die einzelnen Felder des einzelnen Datensatzes.
Aufgabe war, dass die Datensätze sortiert und ausgegeben werden sollen.
Warum ist Eddies Struktur besser? Weil man beim Sortieren einfach usort() benutzt, um das Array zu sortieren. Und weil man bei der Ausgabe des Arrays einfach foreach benutzen kann.
Sortieren:
usort($datenarray, 'cmp')
function cmp($a, $b)
{
return strcmp($a["urlName"], $b["urlName"]);
}
Ausgeben:
foreach ($datenarray as $element)
{
echo $element['urlName'];
echo $element['plainName'];
// ...und so weiter
}
Deine Lösung hingegen kann usort() gar nicht verwenden, sondern man muß array_multisort() benutzen. Denn die Beziehungen zwischen deinem $datenarray['urlName'][0] und $datenarray['plainName'][0] dürfen nicht auseinandergerissen werden. Eddie würde gern ['urlName'] sortiert haben - die dazugehörigen Elemente in ['plainName'] etc müssen natürlich beim Sortieren korrekt mitsortiert werden.
array_multisort ist außerdem in seiner Sortierfähigkeit stark eingeschränkt. ein natcasesort() ist damit nicht realisierbar!
Und auch bei der Ausgabe muß man sich - du hast es in deinem Code ja schon demonstriert - bei foreach etwas mehr verrenken, als es tatsächlich notwendig wäre.
- Sven Rautenberg
Hello,
Wie erzeugt man denn im Foreach $key, ohne dass $val erzeugt wird?
Man benutzt $val einfach.
Ich will aber nicht $val benutzen, sondern $key.
Im Beispiel habe ich $val nicht für die eine von den drei Zeilen benutzt, in der das möglich wäre, damit der Code universell bleibt. man muss nur den Namen der Sortierspalten angeben, und hat sofort die fertige Liste (nachdem man asort() benutzt hat...)
Wenn Du es nicht glaubst, dann musst Du dich mal mit den Programmierern von PHP auseinandersetzen. Die sind da nämlich durchaus meiner Meinung. Ein Beispiel findest Du übrigens auch unter $_FILES.
Die Entgegennahme von Formulardaten ist etwas anderes, als das Erstellen und Verwalten eigener Daten im Array.
Komm, red Dich jetzt nicht raus. Es muss Dir nicht peinlich sein, dass Du auch ein 'Laie' im Sinne der PHPler bist. ;-)
Jetzt zu Eddies Problem: Da gibt es mehrere Datensätze gleichartigen Aufbaus, die sortiert werden sollen.
Dein Vorschlag war, zuerst die Bezeichnung des Feldes als Dimension zu wählen, und als zweite Dimension dann numeriert die Daten dieses Feldes.
Eddies Struktur ist genau umgekehrt: Die erste Dimension numeriert alle existierenden Datensätze durch, und die zweite Dimension unterscheidet dann die einzelnen Felder des einzelnen Datensatzes.
Aufgabe war, dass die Datensätze sortiert und ausgegeben werden sollen.
Das haben wir inzwischen geklärt. Und ob Eddie beim nächsten Projekt die Hierarchische Gliederung oder die nach Spaltentyp benutzt, das kann er selber entscheiden.
Ich bekam übrigens noch den Hinweis, dass man diese Form bewusst gewählt hat, wegen:
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Moin!
Aufgabe war, dass die Datensätze sortiert und ausgegeben werden sollen.
Das haben wir inzwischen geklärt.
So? Wo ist denn deine Sortierfunktion, die genau das tut, was Eddie wollte? Ich habe in deinem ersten Beitrag eigentlich nur Blabla und natcasesort() gefunden - und das tut NICHT, was Eddie wollte.
- Sven Rautenberg
Hello,
So? Wo ist denn deine Sortierfunktion, die genau das tut, was Eddie wollte? Ich habe in deinem ersten Beitrag eigentlich nur Blabla und natcasesort() gefunden - und das tut NICHT, was Eddie wollte.
Wieso? Natcasesort kann eine Spalte der Tabelle (Einen Zweig des Arrays) sortieren. Das funktioniert sogar prima. Sollte Dein PHP da einen Fehler haben, solltet Du mal updaten. ;-)
Der einzige, der hier "blah blah" redet, bist Du. Du hast scheinbar heute zuviel Arroganzpillen geschluckt.
Ich habe einen Lösungsweg beschrieben, wie man derartige Abbildugnen von spaltenorientierten Daten auf Baumstrukturen durchführen kann, und dass dann die einchen (schnellen) Sortierfunktionen ausreichen.
Da Eddie nun aber an einer fast fertigen Applikation etwas verändern musste, war es zu spät dafür.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Also bitte! Beruhigt Euch wieder - das kann doch Euer beider Ernst kam sein...
Gruß aus Berlin!
eddi
Hello,
Also bitte! Beruhigt Euch wieder - das kann doch Euer beider Ernst kam sein...
Wir sind ja in Wirklichkeit beide gar nicht "Wir". Hier kann ja jeder unter jedem namen posten und das macht das Ganze so lustig. Habe gerade meinen nachbarn auch hier entdeckt, denke ich jedenfalls. Mal sehen, ob er weiß, wer ich bin *ggg*
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Moin Moin!
Aber ich erkläre es dir (und Eddie und dem Rest der Welt) natürlich noch mal:
dann hier schon mal ein stückweit Dank vom Rest der Welt.
Gruß aus Berlin!
eddi