Mehrdimensionales Array sortieren
Guma
- php
Hallo zusammen,
hier meine kleine Buchliste als Array
Array
(
[buchliste] => buchliste Object
(
[total] => 3
[items] => Array
(
[0] => 0001
[1] => 0002
[2] => 0003
)
[itemname] => Array
(
[0001] => Buch 2
[0002] => Buch 3
[0003] => Buch 1
)
[itemprice] => Array
(
[0001] => 3.99
[0002] => 2.59
[0003] => 7.59
)
)
$items = array();
foreach($this->items as $tmp_item)
{ ... return $items; }
nach itemprice (Preis aufstegend)
Mit dieser Sortierung benötige ich Hilfe.
Grüße Guma
Danke für die Info, mein array hat eine andere Struktur und sie wie folgt aus, die sortierung soll nach itemprice erfolgen:
[items] => Array
(
[0] => 0001
[1] => 0002
[2] => 0003
)
[itemname] => Array
(
[0001] => Buch 2
[0002] => Buch 3
[0003] => Buch 1
)
[itemprice] => Array
(
[0001] => 3.99
[0002] => 2.59
[0003] => 7.59
)
array_multisort funktioniert hier wahrscheinlich nicht, muss ich mit usort eine Sortierung vornehmen? Guma
Danke für die Info, mein array hat eine andere Struktur und sie wie folgt aus, die sortierung soll nach itemprice erfolgen:
array_multisort funktioniert hier wahrscheinlich nicht, muss ich mit usort eine Sortierung vornehmen? Guma
Hast du den verlinkten Thread genau studiert?
Hello,
Danke für die Info, mein array hat eine andere Struktur
Du bist aber schon dricht dran, es richtiger zu machen...
Dein Array hat eine "Spaltenstruktur" und gerade die lässt sich mit den Standard-Array-Funktionen von PHP erstklassig sortieren. Du musst nur beachten, dass die Index-Bindung dabei nicht verloren geht, also benutze z.B.
asort($items['itemprice'],SORT_NUMERIC);
Das Element "items" kannst Du dir schenken.
Die Indexe mit vorangestellter Null sind unsicher. Bei der kleinsten Unaufmerksamkeit und bei Überlauf der Voranstellung wird der assoziative String-Index automatisch in einen numerischen Index umgewandelt. Also benutze ausschließlich numerische Indexe, oder stelle den en mit 000# auch noch einen Buchstaben voran.
[items] => Array
(
[0] => 0001
[1] => 0002
[2] => 0003
)[itemname] => Array
(
[0001] => Buch 2
[0002] => Buch 3
[0003] => Buch 1
)[itemprice] => Array
(
[0001] => 3.99
[0002] => 2.59
[0003] => 7.59
)
Die Korrelation der Spalten [itemname] und [itemprice] findet ja schon ganz richtig über den Index statt.
Mit Hilfe der von mir hier schon öfter veröffetnlichten universellen Funktionen kannst Du dann Deine Datensätze holen, ändern, hinzufügen, löschen
http://forum.de.selfhtml.org/archiv/2009/5/t187244/#m1244374
Wenn Du eine Liste ausgeben lassen willst, kommt es nur noch darauf an, nach welcher Spalte Du die foreach()-Schleife iterieren lässt.
Du kannst dann alle Sortierungen, also nach jeder Spalte, gleichzeitig bereit halten.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo Tom vom Berg,
danke für deine Antworten, mir ist jetzt klar, dass ich mein array nicht nur in "itemcat" ändern muss sondern in den anderen auch, sonst belibt, wie du schon sagst die Zuordnung nicht erhalten.
Mein Problem startet leider schon weiter vorne. Ich habe keinen Weg gefunden, um die Arraywerte itemcat anzusprechen, die ich ja nummerisch sortieren will.
Versuch war: asort($mycart['itemsortierung'],SORT_NUMERIC);
Das führt aber zu keiner sortierung, denn er kennt $mycart['itemsortierung'] nicht. Was mache ich falsch?
Danach folgt Schritt 2, die Umsortierung der anderen Werte durch eine Scheife.
$new_list = array();
foreach ($this->item_cat as $key => $val) {
$new_list[] = $key;
}
Hier nochmal mein Array:
Array
(
[mycart] => mycart Object
(
[pricetotal] => 7.96
[menge] => 3
[items] => Array
(
[0] => 601
[1] => 873
[2] => 874
)
[itemprices] => Array
(
[601] => 0.75
[873] => 3.00
[874] => 4.21
)
[itemqtys] => Array
(
[601] => 1
[873] => 1
[874] => 1
)
[itemname] => Array
(
[601] => Kiwi
[873] => Salat
[874] => Wurst
)
[itemcat] => Array
(
[601] => 2
[873] => 8
[874] => 4
)
)
[user_id] => 1
[user_nickname] => Guma
)
Kannst Du mir auf die Sprünge helfen. Guma
Hallo Tom,
hatte einen Wert falsch drin. So war meine Frage gemeint:
Versuch war: asort($mycart['itemcat'],SORT_NUMERIC);
Das führt aber zu keiner sortierung, denn er kennt $mycart['itemcat'] nicht. Was mache ich falsch?
Hier nochmal mein Array:
Array
(
[mycart] => mycart Object
(
[pricetotal] => 7.96
[menge] => 3
[items] => Array
(
[0] => 601
[1] => 873
[2] => 874
)
[itemprices] => Array
(
[601] => 0.75
[873] => 3.00
[874] => 4.21
)
[itemqtys] => Array
(
[601] => 1
[873] => 1
[874] => 1
)
[itemname] => Array
(
[601] => Kiwi
[873] => Salat
[874] => Wurst
)
[itemcat] => Array
(
[601] => 2
[873] => 8
[874] => 4
)
)
[user_id] => 1
[user_nickname] => Guma
)
Kannst Du mir auf die Sprünge helfen. Guma
Hello,
hatte einen Wert falsch drin. So war meine Frage gemeint:
Versuch war:
asort($mycart['itemcat'],SORT_NUMERIC);
Das führt aber zu keiner sortierung, denn er kennt $mycart['itemcat'] nicht. Was mache ich falsch?
Du beachtest nicht, dass Du hier PHP-Arrays und PHP-Objekte gemischt verwendest, was durchaus erlaubt ist, aber eben dann zu diesen ADS-Fehlern führt.
versuch es mal mit
asort($mycart->itemcat,SORT_NUMERIC);
Das sollte eigentlich dann klappen und keine Fehlermeldung mehr erzeugen.
Die Fehlermeldungen möchten wir übrigens immer im Originaltext sehen hier, wenn derartige Fragen gestellt werden. Dazu musst Du dein Fehlermanagement auch vollständig eingeschaltet haben:
error_reporting(E_ALL); ## müsste noch ausreichen
ini_set('display_errors', 1);
Hier nochmal mein Array:
Array
(
[mycart] => mycart Object
(
[pricetotal] => 7.96
[menge] => 3
[items] => Array
(
[0] => 601
[1] => 873
[2] => 874
)[itemprices] => Array
(
[601] => 0.75
[873] => 3.00
[874] => 4.21
)[itemqtys] => Array
(
[601] => 1
[873] => 1
[874] => 1
)[itemname] => Array
(
[601] => Kiwi
[873] => Salat
[874] => Wurst
)[itemcat] => Array
(
[601] => 2
[873] => 8
[874] => 4
))
[user_id] => 1
[user_nickname] => Guma
)
BTW:
Meine Funktionen passen auf obige Abwandlung des "Spaltenarray"s natürlich nicht mehr in der Universalform. Dazu muss auch das Spaltenarray normiert vorliegen...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>
Danke für die Infos,
die sortierfunktion gibt eine fehlermeldung aus:
Warning: asort() expects parameter 1 to be array, null given in mytest.php on line 96
dort steht (96) asort($mycart->itemcat,SORT_NUMERIC);
Ich komme einfach nicht über diese Hürde. Grüße Guma
Hello,
Danke für die Infos,
Bitte.
die sortierfunktion gibt eine fehlermeldung aus:
Warning: asort() expects parameter 1 to be array, null given in mytest.php on line 96dort steht (96) asort($mycart->itemcat,SORT_NUMERIC);
Ich komme einfach nicht über diese Hürde. Grüße Guma
Wie bist Du denn zu der Ausgabe gekommen:
Array
(
[mycart] => mycart Object
(
[pricetotal] => 7.96
[menge] => 3
[items] => Array
(
[0] => 601
[1] => 873
[2] => 874
)[itemprices] => Array
usw.
Da steht ja irgendwo
print_r($meine_variable);
also muss es auf der Ebene doch auch heißen
asort($meine_variable['mycart]->itemcat,SORT_NUMERIC);
Du musst schon die vollständige Referenz angeben auf das zu sortierende Array.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
[itemname] => Array
(
[0001] => Buch 2
[0002] => Buch 3
[0003] => Buch 1
)
Damit Du siehst, wie unsicher diese 000#-Keys sind hier ein kleines Denkscript aus meiner Sammlung:
<?php ### insert_key.php ###
#------------------------------------------------
function display(&$_liste)
{
echo "<pre>\r\n";
echo htmlspecialchars(print_r($_liste,1));
echo "</pre>\r\n";
}
#------------------------------------------------
function display_types(&$_liste)
{
echo "<pre>\r\n";
foreach($_liste as $key => $value)
{
echo htmlspecialchars($key).": ".gettype($key)."\r\n";
}
echo "</pre>\r\n";
}
#------------------------------------------------
$_liste = array();
$_liste[-20] = "Minus Zwanzig";
$_liste[] = 9;
$_liste[] = 1;
$_liste[] = '01';
display($_liste);
$_liste[1] = 'neuer Datensatz';
display($_liste);
$_liste['ende'] = "Ende im Gelände";
$_liste['anfang'] = "Das ist der Anfang";
$_liste['2'] = "Element '2'";
display($_liste);
$_liste[] = "automatisch hinzu";
$_liste['02'] = "Extra Key '02'";
$_liste[02] = "und jetzt Extra Key 02 ohne Häkchen";
$_liste[''] = "Leerer Key ist nicht kein Key";
$_liste['7'] = "Key '7'";
$_liste[5] = "Key 5";
$_liste[-2] = "Element -2";
display($_liste);
display_types($_liste);
?>
Du musst also beim Key nur mal die Häkchen vergessen und schon ist es passiert!
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg