Zweidimensionales Array sortieren (mit usort()?)
sandy
- php
Hallo miteinander...
Ich habe ein Array:
$alle_links = array();
$alle_links[0]["url"] = $url;
$alle_links[0]["parent"] = "";
$alle_links[0]["status"] = "";
Dieses möchte ich gerne nach "status" sortieren. Die Daten werden aus einer Datenbank gelesen.
Falls das wichtig ist: Später wird der ganze Datensatz in ein anderes Array gespeichert:
$problem_links[] = "Die Page: ".$alle_links[$index]["parent"]."\nverweist auf: ".$alle_links[$index]["url"]."\nStatus: ".$alle_links[$index]["status"];
Ich hab versucht, das mit usort() zu lösen, aber es funktioniert leider nicht! : (
Kann mir biiiiitte jemand helfen?
Gruss Sandy
Ich hab versucht, das mit usort() zu lösen, aber es funktioniert leider nicht! : (
Kann mir biiiiitte jemand helfen?
usort — Sort an array by values using a user-defined comparison function
array_multisort — Sort multiple or multi-dimensional arrays
Ich stelle in den Raum, dass ein 2-dimensionales Array als mehrdimensionales Array durchgeht.
usort — Sort an array by values using a user-defined comparison function
array_multisort — Sort multiple or multi-dimensional arrays
jaa.. danke, hab schon beide angeschaut!
ich sollte ja nach einer spalte sortieren, es gibt auch viele beispiele, aber ich finde keins, das auf meines zutreffen könnte. : (
Ich kann ja auch angeben, dass es mir dieses Array sortiert, aber es sortiert immer nach index und nicht nach status..
gruss
ich sollte ja nach einer spalte sortieren, es gibt auch viele beispiele, aber ich finde keins, das auf meines zutreffen könnte. : (
Ich kann ja auch angeben, dass es mir dieses Array sortiert, aber es sortiert immer nach index und nicht nach status..
Gehe zurück nach der Badstrasse - es gibt nicht "viele Beispiele" sondern exakt vier. Eines davon löst dein Problem.
Hello,
Gehe zurück nach der Badstrasse - es gibt nicht "viele Beispiele" sondern exakt vier. Eines davon löst dein Problem.
Und dann gibt es immer noch mindestens eine zusätzliche Rebellenlösung
https://forum.selfhtml.org/?t=187244&m=1244374
:-)
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
(Hallo|Hi(i){0,4}(ho)|Howdy|Tag|Mahlzeit) sandy,
Ich habe ein Array:
$alle_links = array();
$alle_links[0]["url"] = $url;
$alle_links[0]["parent"] = "";
$alle_links[0]["status"] = "";
> Dieses möchte ich gerne nach "status" sortieren.
> Falls das wichtig ist: Später wird der ganze Datensatz in ein anderes Array gespeichert:
Nö, es sei denn, du willst denn derzeitigen Zustand des Arrays erhalten. Die Array-Sortierfunktionen von PHP erledigen ihre Arbeit
"inplace", d.h. verändern die Reihenfolge der Einträge, im Gegensatz zu (bspw.) Perl, da wird eine sortierte Kopie erzeugt. Falls du das Array also im Originalzustand später noch benötigst, solltest du erst eine Kopie davon anlegen, bevor du die Sortierfunktion darauf loslässt.
> Ich hab versucht, das mit usort() zu lösen, aber es funktioniert leider nicht! : (
Und was genau hast du bisher unternommen?
Falls du dein Beispiel-Array benutzt hast: Bei Arrays mit weniger als 2 Einträgen wirft usort() die benutzerdefinierte Vergleichsfunktion gar nicht erst an. Ist auch irgendwie sinnbefreit, Arrays mit einem oder keinem Eintrag sortieren zu wollen ... ;-)
Irgendwie hab ich das dumpfe Gefühl, dass du meinen Vorschlag, [direkt in der Vergleichsfunktion mit var_dump() eines der zu vergleichenden Teil-Arrays anzuzeigen](https://forum.selfhtml.org/?t=187004&m=1242569), schon gelesen hast. Der würde auch hier funktionieren. Du bekämst eine Ausgabe, ähnlich wie die folgende:
array(3) {
["url"]=> string(18) "irgendeine url"
["parent"]=> string(0) "irgendwas"
["status"]=> string(1) "irgendein status"
}
Und damit dürfte klar sein, auf welchen Schlüssel die benutzerdefinierte Vergleichsfunktion angewendet werden muss:
~~~php
function ucompare($a, $b) {
strcmp($a['status'], $b['status']);
}
usort($alle_links, 'ucompare');
Ich bin davon ausgegangen, dass es sich beim "status"-Feld um eine Zeichenkette handelt, daher die Verwendung von strcmp(). Das liefert auch gleich die richtigen Rückgabewerte. Wie die Rückgabewerte aussehen müssen, kannst du [linkhttp://php.net/manual/de/function.usort.php#function.usort.parameters@title=im PHP-Handbuch nachlesen]. Und wenn du schon mal auf der Seite bist, könntest du dir ganz unverbindlich das Code-Beispiel Nummer #2 für "multidimensionale" Arrays anschauen.
Kann mir biiiiitte jemand helfen?
5 x "i" -- soll die Anzahl der "i"'s in /bi+tte/ die Dringlichkeit anzeigen?
MffG
EiiiiisFuX
Kleine Korrektur:
*grr*
Ich bin davon ausgegangen, dass es sich beim "status"-Feld um eine Zeichenkette handelt, daher die Verwendung von strcmp(). Das liefert auch gleich die richtigen Rückgabewerte. Wie die Rückgabewerte aussehen müssen, kannst du [linkhttp://php.net/manual/de/function.usort.php#function.usort.parameters@title=im PHP-Handbuch nachlesen]. Und wenn du schon mal auf der Seite bist, könntest du dir ganz unverbindlich das Code-Beispiel Nummer #2 für "multidimensionale" Arrays anschauen.
Das sollte natürlich heißen:
Ich bin davon ausgegangen, dass es sich beim "status"-Feld um eine Zeichenkette handelt, daher die Verwendung von strcmp(). Das liefert auch gleich die richtigen Rückgabewerte. Wie die Rückgabewerte aussehen müssen, kannst du im PHP-Handbuch nachlesen. Und wenn du schon mal auf der Seite bist, könntest du dir ganz unverbindlich das Code-Beispiel Nummer #2 für "multidimensionale" Arrays anschauen.
3 x "Vorschau" gedrückt und trotzdem übersehen ...
Hello,
warum hast Du das Array so organisiert?
siehe https://forum.selfhtml.org/?t=187244&m=1244374
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
[latex]Mae govannen![/latex]
warum hast Du das Array so organisiert?
Die Sortierung
[0]
[$property1][$data]
[$property2][$data]
[$property3][$data]
[1]
[$property1][$data]
[$property2][$data]
[$property3][$data]
halte ich für wesentlich sinnvoller als
[$property1]
[0][$data]
[1][$data]
[$property2]
[0][$data]
[1][$data]
[$property3]
[0][$data]
[1][$data]
Im ersten Fall hat man alle Daten eines Satzes an einer Stelle abgelegt, im Zweiten muß man sie sich über den jeweiligen Index 'zusammensuchen', was spätestens beim Verändern eines Arrays (löschen/umstellen) mehr Aufwand bedeutet, weil man bei jeder Änderung über sämtliche 'Primärkeys' iterieren muß.
Außerdem fehlt in 2) die Datenbindung. Es ist IMO einfach sauberer und praktischer, zusammegehörende Daten auch zusammengehörend zu organisieren.
Cü,
Kai
Hello,
[latex]Mae govannen![/latex]
warum hast Du das Array so organisiert?
Die Sortierung
[0]
[$property1][$data]
[$property2][$data]
[$property3][$data]
[1]
[$property1][$data]
[$property2][$data]
[$property3][$data]halte ich für wesentlich sinnvoller als
[$property1]
[0][$data]
[1][$data]
[$property2]
[0][$data]
[1][$data]
[$property3]
[0][$data]
[1][$data]Im ersten Fall hat man alle Daten eines Satzes an einer Stelle abgelegt,
Woher weißt Du, wo PHP die daten ablegt und was geht Dich das als Programmierer einer X-GL (X > 3) überhaupt noch an? Du musst dafür sorgen, dass Du die Aufgaben so bequem sie möglich lösen kannst.
im Zweiten muß man sie sich über den jeweiligen Index 'zusammensuchen', was spätestens beim Verändern eines Arrays (löschen/umstellen) mehr Aufwand bedeutet, weil man bei jeder Änderung über sämtliche 'Primärkeys' iterieren muß.
Na und? Erstens gibt es nur einen korrespondierenden Schlüssel und zweitens gibt es ja die von mir geposteten Zugriffsfunktionen dafür. DU musst also gar nichts iterieren. Du musst nur zugreifen lassen.
Außerdem fehlt in 2) die Datenbindung. Es ist IMO einfach sauberer und praktischer, zusammegehörende Daten auch zusammengehörend zu organisieren.
Die Daten sind 'zusammengehörig' organisiert. Die Regel für die Zsammengehörigkeit heißt einfach: Gleicher Index = gleicher Datensatz.
Ich habe bisher selten gesehen, dass man Aggregatsfunktionen über einen Datensatz ausübt, aber dass sie über eine Spalte der Datenhaltung ausgeübt werden, ist durchaus üblich. Warum sollte ich dies nun durch eine falsch verstandene "Daten-zusammen-bindung" (unter Datenbindung versteht man etwas anderes) erschweren?
Außerdem kann ja jeder so programmieren, wie es ihm passt, solange er das nicht für mich tut :-)
Ich habe hier lediglich eine Lösung vorgestellt, die vieles Vereinfacht, während Dein Klammern an übliche Vorgehensweisen nur Probleme verursacht.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
[latex]Mae govannen![/latex]
Die Daten sind 'zusammengehörig' organisiert. Die Regel für die Zsammengehörigkeit heißt einfach: Gleicher Index = gleicher Datensatz.
Und genau diese Struktur halte _ich_ für nicht sinnvoll. Würdest du z.B als Münzsammler jeweils das 1ct-Stück jedes Landes ins erste Fach eines separates Münzalbum stecken, dann das 2ct Stück jeweils ins zweite Fach usw. Wenn du alle Münzen eines Landes anschauen willst, mußt du dann ja "nur" den Index beachten, z.B. die jeweils dritte Münze in jedem Album gehört zum gewünschten Land.
Oder steckst du doch lieber alle Münzen eines Landes hintereinander in ein Album und hast sie so zusammenhängend abgelegt?
Cü,
Kai
Hello,
Die Daten sind 'zusammengehörig' organisiert. Die Regel für die Zsammengehörigkeit heißt einfach: Gleicher Index = gleicher Datensatz.
Und genau diese Struktur halte _ich_ für nicht sinnvoll. Würdest du z.B als Münzsammler jeweils das 1ct-Stück jedes Landes ins erste Fach eines separates Münzalbum stecken, dann das 2ct Stück jeweils ins zweite Fach usw. Wenn du alle Münzen eines Landes anschauen willst, mußt du dann ja "nur" den Index beachten, z.B. die jeweils dritte Münze in jedem Album gehört zum gewünschten Land.
Da kann ich Dir jetzt nicht folgen.
Was hat eine physische Ordnung in Holzkästen oder eine Sicht (View) für den Computerbenutzer damit zu tun, wie man seine Daten im Hintergrund in Strukturen verpackt, um möglichst viel automatisiert damit arbeiten zu können?
Löse Dich einfach von dem Gedanken, dass man auf einer Datenbank gut sitzen können muss.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
echo $begrüßung;
Und genau diese Struktur halte _ich_ für nicht sinnvoll. Würdest du z.B als Münzsammler jeweils das 1ct-Stück jedes Landes ins erste Fach eines separates Münzalbum stecken, dann das 2ct Stück jeweils ins zweite Fach usw. Wenn du alle Münzen eines Landes anschauen willst, mußt du dann ja "nur" den Index beachten, z.B. die jeweils dritte Münze in jedem Album gehört zum gewünschten Land.
Wie die Daten intern verwaltet werden und wie sie nach außen hin dargestellt werden können durchaus zwei Paar Schuhe sein. Du beschreibst die übliche Zusammenfassung von Daten, weil es im Allgemeinen sinnvoll erscheint, sie nach diesem zusammenfassenden Kriterium zu ordnen. Die frühere Art der Datenverwaltung - auf Karteikarten - hat sich bewehrt, da man meist alle Daten zu einem Vorgang benötigt. Doch was ist, wenn man einen schnellen Zugriff auf ein einzelnes Datum aber über alle Einträge benötigt? Auch die Datenbankentwickler haben festgestellt, dass es mühsamer ist, beispielsweise für ein Sortieren, aus jedem Datensatz zuerst das Sortierkriterium extrahieren zu müssen. Und man hat Indexe erfunden, die - um bei deinem Beispiel zu bleiben - alle 1-Cent-Stücke in einer Struktur ablegen. Das jedoch zusätzlich zur zeilenweisen Speicherung.
Und genauso kann man auch in diesem Fall verfahren. Man kann seine Daten primär nach Zeilen verwalten und wenn man eine spaltenorientierte Sortierung benötigt, erstellt man sich quasi einen Index, den man beispielsweise für das Sortieren mit array_multi_sort() verwenden kann.
Die andere Vorgehensweise ist die von Tom propagierte: spaltenweise Datenhaltung und Zugriffsfunktion für den zeilenweisen Zugriff. Welche von beiden Methoden die bessere ist, muss für den jeweiligen Anwendungsfall entschieden werden. Braucht man viel Sortierung und Aggregatfunktionen, hat die spaltenorientierte Anordnung die Pluspunkte auf ihrer Seite und Mehraufwand beim zeilenweisen Zugriff.
echo "$verabschiedung $name";
Moin!
Und genauso kann man auch in diesem Fall verfahren. Man kann seine Daten primär nach Zeilen verwalten und wenn man eine spaltenorientierte Sortierung benötigt, erstellt man sich quasi einen Index, den man beispielsweise für das Sortieren mit array_multi_sort() verwenden kann.
Die andere Vorgehensweise ist die von Tom propagierte: spaltenweise Datenhaltung und Zugriffsfunktion für den zeilenweisen Zugriff.
Der Unterschied zwischen beiden Methoden ist ein ziemlich bedeutender: Während die Methode mit dem Index an erster Stelle und einem Iterieren über diesen Index immer nur genau EINE Sortierreihenfolge ergeben kann, bietet die Methode mit dem Index an zweiter Stelle die Gelegenheit, die Sortierreihenfolge für JEDES DATENFELD separat herzustellen.
Außerdem ist das Sortieren deutlich einfacher, wenn man mit Methode 2 arbeitet.
Natürlich ist es der erste Reflex, ein Array der Datensätze immer mit numerischem, aufsteigendem Index zu erstellen, aber dieser numerische Index hat bei der zweiten Methode nicht mehr die Aufgabe der fortlaufenden Numerierung, sondern entspricht der Datensatz-ID. Und es ist nicht die schlechteste Idee, diese ID auch als Index zu nutzen, wenn der Datensatz sowas hat.
- Sven Rautenberg