Arrays sortieren?

Hi,

Ich hab ein Riesenarray aus ner Datenbankabfrage das sieht so aus:
@[0][Begriff]=„ccd“
@[0][Beschreibung]=„fuuufasf“
@[1][Begriff]=„asd“
@[1][Beschreibung]=„asdasdadfasf“
@[2][Begriff]=„ssd“
@[2][Beschreibung]=„reradfasf“
…usw.

Nun will ich alles nach dem Begriff nach dem Alphabet sortieren, hab aber grad keine Idee.
Die nocrmalen Sort-Funktionen helfen mir nicht oder ich hab noch nicht rausgefunden wie.

Kann mir jemand helfen?

cu Desian.de

Ähem … vielleicht bin ich ja zu naiv … aber wieso lässt du nicht einfach die Datenbank sortieren?? Einfach ein ‚order by begriff‘ oder wie die spalte auch immer heißt und du kannst dein Array gleich richtig sortiert befüllen.

Gruß
Benky

Hallo Desian,

Du hast Recht, die Standard-Funtionen von php reichen hierzu nicht aus.

Das Sortier-Verfahren, das Du hier brauchst heisst anscheinend „Bubble-Sort“, vielleicht findest Du im Netz irgendwo eine Anleitung, ich selber kanns leider nicht!

Gruß
Harry

Wenn du es unbedingt in PHP machen willst … sollte eigendlich auch gehen. Es gibt da die Funktion array_multisort … mit der kann man das gleiche machen, wie in ner SQL-Abfrage mit order by.

Ich nehme mal an, das du das Array selber befüllt hast, oder? (bin selber noch neuling in PHP) Du musst einfach die Array-Indizes umdrehen. Also statt
a[0][Begriff]=„ccd“
a[0][Beschreibung]=„fuuufasf“
a[1][Begriff]=„asd“
a[1][Beschreibung]=„asdasdadfasf“

a[Begriff][0]=„ccd“
a[Beschreibung][0]=„fuuufasf“
a[Begriff][1]=„asd“
a[Beschreibung][1]=„asdasdadfasf“

Dann sollte das Array mit dem Aufruf

array_multisort( $a[Begriff], $a[Beschreibung] );

richtig sortiert werden.

Gruß
Benky

Hi,

Ich nehme mal an, das du das Array selber befüllt hast, oder?

Nein. Da giebt es eine Funktion die ein assoziatives Array erstellt: ‚$Eintrag = mysql_fetch_array($result)‘
dann ist der Inhalt mit der Tabelle asizoiert:
dh.
An der stelle $Eintrag[Begriff] steht „hallo“
An der stelle $Eintrag[Beschreibung] steht „Grußwort“
Nun hab ich aber eine ganze reihe von solchen assoziativen Arrays und die sind in einem Indizierten Array zusammengefaßt:
‚while($Eintraege[] = mysql_fetch_array($result)){}‘
Und da beginnt das dilemma. Ich will die Einträge in einer Tabelle schön aufgelistet anzeigen. Das klappt auch soweit, nur nicht alphabetisch.

cu Desian

‚while($Eintraege[] = mysql_fetch_array($result)){}‘

Also befüllst du das große Array doch selber! Dann musst du doch nur das while ein wenig ummodeln und schon klappt es.

$index=0;
while($Eintrag = mysql_fetch_array($result)) {
$Eintraege[„Begriff“][$index]=Eintrag[„Begriff“];
$Eintraege[„Beschreibung“][$index]=Eintrag[„Beschreibung“];
&index++;
}
Jetzt hast du ein Array, das du wie im ursprünglichen Artikel mit dem array_multisort nach belieben sortieren kannst.

Ich habe die Vermutung, dass es auch noch ne elegantere Methode gibt, um das Array Eintrag entsprechend zu kopieren, z.B. so, dass das spaltenweise kopieren nicht für jede Spalte ausprogrammiert werden muss. Aber wie gesagt, ich hab selbst erst ne kurze PHP Referenz durchgeblättert.

Und wie in dem ersten Beitrag schon erwähnt, warum machst du das nicht einfach mit dem ‚order by‘ im SQL-Select??

Gruß
Benky

‚while($Eintraege[] = mysql_fetch_array($result)){}‘

Also befüllst du das große Array doch selber! Dann musst du
doch nur das while ein wenig ummodeln und schon klappt es.

Naja indirekt, weil das ghat bisher eine Standartfunktion übernommen.

$index=0;
while($Eintrag = mysql_fetch_array($result)) {
$Eintraege[„Begriff“][$index]=Eintrag[„Begriff“];
$Eintraege[„Beschreibung“][$index]=Eintrag[„Beschreibung“];
&index++;
}
Jetzt hast du ein Array, das du wie im ursprünglichen Artikel
mit dem array_multisort nach belieben sortieren kannst.

So ist es mit zu umständlich aber du hast mich da auf eine Idee gebracht:
while($Eintrag = mysql_fetch_array($result))
{$Eintraege[$Eintrag[Begriff]]=Eintrag;}
sort($Eintraege);
(;p

cu Desain

while($Eintrag = mysql_fetch_array($result))
{$Eintraege[$Eintrag[Begriff]]=Eintrag;}
sort($Eintraege);

Du meinst bestimmt ksort. Hmmm … irgendwie versteh ich dann die PHP-Doku nicht. Da steht doch, dass arrays als Hashmap impelementiert sind. Das kann ja wohl nicht alles sein. Schließlich ist in einer reinen Hash nix sortiert.

Wie dem auch sei. Auf jeden Fall klappt das nur, wenn die Begriffe auch eindeutig sind, also nicht ein Begriff mehrfach auftauchen kann. Zudem kann man in der lösung von mir später auch nach den anderen Spalten umsortieren.

;o)

PS: Du hast mir immer noch nicht gesagt, warum du die Sortierung nicht mit dem ‚order by‘ machst

Hi,

PS: Du hast mir immer noch nicht gesagt, warum du die
Sortierung nicht mit dem ‚order by‘ machst

Weil ich an der DB so wenig wie möglich rumschrauben will.
Ich müßte das bei jedem neuen Begriff machen und das würde ständig DB-Performence kosten.

cu Desian.de

Hi,

Schließlich ist in einer reinen Hash nix sortiert.

Is nich Perl. ‚sort()‘ klappt.
Was für 'ne Doku benutzt duenn da eigendlich?
Ich hab mir das PHP-Handbuch von www.php.net gesaugt. Das ist zum größten Teil sogar in deutsch.

auftauchen kann. Zudem kann man in der lösung von mir später
auch nach den anderen Spalten umsortieren.

Ja, das habe ich gleich Variable gelößt und die Funktion umgeschrieben mit einem Optionalen Parameter mehr, sollte man nach irgendwas sortieren wollen.(Hmm, ich könnte es danach zurück in ein indiziertes Array verwandeln…*g*)

cu Desian

Sach mal … hast du den ganzen Tag nix anderes zu tun, als hier zu posten *fg*

Der Begriff hash hat mit Perl oder so nix zu tun. Das allgemeine Prinzip, das hinter hash steht ist, das es eine Funktion gibt, die sogenannte hash-Funktion … wenn man in die den Key reinsteckt, dann kommt ein Index innerhalb eines vorher reservierten Bereiches raus (z.B. ein Index in einem Indizierten-array oder eine Datensatznummer oder eine Sektornummer der Festplatte…). An dieser Stelle wird dann key und value abgelegt. Ist der Bereich schon belegt, dann wird ein rehash ausgeführt usw. bis ein leerer Bereich oder der mit dem gleichen Key gefunden wird. Ziel einer solchen Funktion ist es, den wesentlich größeren Raum der Schlüsselwerte auf einen beschränkten reservierten Bereich abzubilden und gleichmäßig zu verteilen. Und wie schon erwähnt liegen diese Keys unsortiert im Speicher oder auf Platte oder wo auch immer.
In der Doku (ich hab mir für nen schnellen Überblick von O’Reilly die PHP Pocket Reference gekauft, nutze aber auch das von dir erwähnte PHP Handbuch) steht nun lediglich, dass ein Array in PHP nix anderes ist, als ne Hashtable. Gerade Befehle wie ksort lassen mich allerdings daran zweifeln, dass da nicht doch noch mehr dahinter steckt.

sort() klappt bei dir vermutlich nur, weil zufällig das erste Feld in dem Eintrag-Array auch das Feld ist, nach dem du sortiert haben möchtest. Denn sort sortiert das Array nach dem Inhalt. ksort dagegen sortiert das Array nach dem key, was ja vermutlich eigendlich auch deine Absicht war.

Du hast 20 min. zum Antworten *fg*

Gruß
Benky

Sach mal … hast du den ganzen Tag nix anderes zu tun, als
hier zu posten *fg*

So iss’es ja auch nicht. Ich Programmier halt den ganzen Tag, steh fast am Anfang damit und brauch halt hier und da mal Hilfe.
Was ist da besser als es in ein Forum zu Posten, das viel Besucht ist? :wink:

Inhalt. ksort dagegen sortiert das Array nach dem key, was ja
vermutlich eigendlich auch deine Absicht war.

Hast recht, bei einem Anderen Beispiel hat es nicht geklapptt.
Das funktionstüchtige Ergebnis ist nun:
###################################################
function sort_table_array($array,$key)
{
while($array)
{
$teil = array_pop($array);
if(!$teil) {continue;}
$liste[] = strtolower($teil[$key]);
$array_help[strtolower($teil[$key])] = $teil;
}
sort($liste);
while($liste)
{
$teil = array_pop($liste);
if(!$teil) {continue;}
$array_new[$teil] = $array_help[$teil];
}
return $array_new;
}//END sort_table_array()
###################################################

Du hast 20 min. zum Antworten *fg*

OK, es hat etwas länger gedauert *g*

cu Desian