zweidimensionalen Array sortieren
Wolfgang
- php
Hallo,
ich habe folgenden Array:
$array_out[$i]['TEXT']
Der Array enthält bis zu 200 Elemente für '$i' und 20 Positionen (konstant) für 'TEXT'. Im Feld TEXT wird der Index auch über einen Text definiert, nicht über eine Zahl.
Nun will ich den Array nach z.B. EBELP (Position) sortieren.
EBELN LIFNR EBELP ...
1 1072536 57829 10
2 1928382 83722 10
3 1928382 83722 20
4 ... ... ...
5 ... ... ...
...
200
Nun habe ich da bei www.php.net die Funktion usort gefunden. Leider habe ich diese wohl in keinster Weise verstanden.
So sieht die Funktion bei php.net aus:
<?php
function cmp ($a, $b) {
return strcmp($a["fruit"], $b["fruit"]);
}
$fruits[0]["fruit"] = "Zitronen";
$fruits[1]["fruit"] = "Äpfel";
$fruits[2]["fruit"] = "Trauben";
usort($fruits, "cmp");
while (list ($key, $value) = each ($fruits)) {
echo "$fruits[$key]: " . $value["fruit"] . "\n";
}
?>
Ich habe sie folgender maßenumgebaut:
<?php
function cmp ($a, $b) {
return strcmp($a["EBELP"], $b["EBELP"]);
}
...Array ist schon oben definiert/angelegt.
usort($array_out, "cmp");
...Die Ausgabe könne wir uns hier sparen.
?>
Vielleicht ist da nur ein kleiner Schnitzer drin. Danke für Eure Hilfe schon mal im Voraus.
Viele Grüße
Wolfgang
Hallo Wolfgang,
habe eine Frage zum Verständnis ->
$array_out[$i]['TEXT']
$i diese Spalte ist $i?
EBELN LIFNR EBELP ...
1 1072536 57829 10
2 1928382 83722 10
3 1928382 83722 20
4 ... ... ...
5 ... ... ...
...
200
Wie ist EBELN, LIFNR, EBELP und ... definiert?
Etwas in der Form:
$array_out[$i]['EBELN']['LIFNR']['EBELP']
oder aber
$array_out[$i]['TEXT']='1072536/57829/10'
Gruß aus Berlin!
eddi
Hallo Eddi,
Wie ist EBELN, LIFNR, EBELP und ... definiert?
Etwas in der Form:
$array_out[$i]['EBELN']['LIFNR']['EBELP']
oder aber
$array_out[$i]['TEXT']='1072536/57829/10'
Wenn Du die genauen Bezeichnungen dir mal weg denkst, dann so:
$array_out[$i][$j], wobei $j jetzt für die Feldbezeichnung steht.
Gruß Wolfgang
Re Wolfgang,
for($i=1;$i<count($array_out);$i++)
{
$b[$array_out[$i]['EBELP']]=$array_out[$i];
}
natsort($b);
(keine elegante Lösung aber eine Lösung ;)
Gruß aus Berlin!
eddi
Denkfehler sorry:
for($i=1;$i<count($array_out);$i++)
{
$b[$array_out[$i]['EBELP']][]=$array_out[$i];
}
ksort($b);
reset($b);
oder anstatt dann eine andere Sortierung...
Dein Output
(keine elegante Lösung aber eine Lösung ;)
Gruß aus Berlin!
eddi
Gruß aus Berlin!
eddi
Hallo Edi,
for($i=1;$i<count($array_out);$i++)
{
$b[$array_out[$i]['EBELP']][]=$array_out[$i];
}
ksort($b);
reset($b);
Mir ist die Logik noch nich so klar. Ich habe ja einen zweidimensionalen Array. Und Du weisst dem Werte eines eindimensionalen Arrays zu. Welchen Array muss ich da jetzt ausgeben. $b oder $array_out?? Sorry, aber ich habe mit den Arrays so mein Handycap.
Gruß
Wolfgang
Re:
$b muß ausgegeben werden und hat sieht nacher folgendermaßen aus:
$b[10][$i]['EBELN']="1072536";
['LIFNR']="57829";
['EBELP']="10";
wobei $i der Index aller Datenfelder ist, die den selben Wert EBELP haben.
Gruß aus Berlin!
eddi
Hallihallo,
$b[10][$i]['EBELN']="1072536";
['LIFNR']="57829";
['EBELP']="10";wobei $i der Index aller Datenfelder ist, die den selben Wert EBELP haben.
das heißt, dass ich dann einen dreidimensionalen Array habe?
und ich kann nicht mehr so die Werte ausgeben:
echo $b[$i]['EBELN'];
echo $b[$i]['LIFNR'];
echo $b[$i]['EBELP'];
oder doch ??
Ich habe bei der ausgabe eine for-Schleife, die die Werte in eine tabelle ausgibt. Die Zeile "<tr>" geht über den Index $i und die Spalte "<td>" geht über die "EBELN, LIFNR, EBELP, ...". Wenn jetzt noch ein Index dazu kommt, dann muss ich den also immer vorne an stellen, und in dem steht dann welcher Wert?? es kann ja bei einer Position auch mal 20(steht für die zweite Position) drin stehen.
Und mir fällt gerade ein, dass bei EBELN und LIFNR immer Nullen vorangestellt sind, so dass es insgesamt 10 Stellen sind und bei EBELP auf 5 Stellen aufgefüllt ist. Das ist in der DB so gespeichert, und kann ich auch nicht ändern.
Also EBELN = 0001072536
LIFNR = 0000057829
EBELP = 00010
Sorry, hatte ich voll vergessen. Habe die Ausgabe schon entsprechend formatiert.
Ich hoffe, du behälst da noch den Überblick
Viele Grüße
Wolfgang
Hallihallo Wolfgang,
da mußt Du jetzt durch. Datenfelder liegen Dir anscheinend wirklich nicht. Daher kann ich Dir nur anraten Dich ein wenig mit dem Startmenü zu beschäftigen, denn dieses Startmenü ist für meine Begriffe die beste grafische Umsetzung eines arrays.
Wenn Dir dann klargeworden ist, das ein Index ansich auch eine Variable speichern kann (was sich am besten in der Funktion array_flip() ausdrückt), dann werden auch arrays zukünfig keine Probleme für Dich sein.
Vorerst, um Dein Problem schnellstmöglich lösen zu können, empfele ich Dir unter http://www.php.net/ einfach nach foreach() zu suchen und anhand Deines $array_out verschiedene Test zu machen (Ausgabe mit echo), um dann zu beginnen die einzelenn foreach-Anweisungen zu verschateln. Aber als erstes kannst Du auch mit print_r($array_out) arbeiten und dann mein code-Schnippsel in Deinen Code einbauen und vergleichen print_r($array_out) zu print_r($b).
Tut mir leid, aber da mußt Du jetzt erstmal durch ;)
Gruß aus Berlin!
eddi
Hallo Eddi,
also die Sortierung funktioniert jetzt. Danke erstmal für deine Hilfe. Jetzt bin ich mir aber nicht ganz darüber im klaren, wie ich meine Ausgabe gestalten muss.
Ich möchte die Werte in eine Tabelle ausgeben. bei meinem alten, nicht sortierbaren array sah dass so aus.
<table>
<tr>
<td bgcolor="<? echo $color;?>" nowrap><? $o_lifnr = $array_out[$n]['LIFNR'] + 0; echo $o_lifnr;?></td>
<td bgcolor="<? echo $color;?>" nowrap><? $o_ebelp = $array_out[$n]['EBELP'] + 0; echo $o_ebelp;?></td>
</tr>
</table>
Nun, da war das ganz einfach über den Index $n. Jetzt ist mir aber nicht klar, wie ich auf die einzelnen Elemente komme. Ich kann zwar mit
z.B. <? echo $b['00010']['0']['EBELN'];?>
das Element ausgeben, aber wie soll ich das dynamisch gestalten? Zumal es bei Sortieren nach Position meist nur zwei erste Indizies gibt, aber bei einer Mengenangabe es soviele erste Indizies geben kann wie nachher Zeilen.
Wäre super, wenn Du mir da noch den einen oder anderen Tipp geben könntest.
Und mal wieder ein Danke schön.
Viele Grüße
Wolfgang
Hallo Wolfgang,
na prizipiell hat sich nicht viel verändert.
foreach($b as $k=>$v)
{
for($i=0;$i<count($b[$k]);$i++)
{
foreach($b[$k][$i] as $v)
{
# definition für den Wechsel von $color
echo '<td bgcolor='.$color.' nowrap>'.$v.'0</td>';
}
}
}
Das $n ist in dem Fall einfach nur $i und ist nicht mehr der primere Index.
Gruß aus Berlin!
eddi
Hallo Eddi,
jetzt zum letzten Mal. Die Sache funktioniert einwandtfrei und ist schnell.
Vielen Dank für Deine Hilfe.
Was mich wundert ist, dass es so schwer war, dafür eine Lösung zu finden. ich wäre davon ausgegangen, dass PHP selbst eine Funktion in etwa dieser Form zur Verfügung stellt.
2d_array_sort($array, 'Suchparameter für ersten Index', 'Suchparameter für zweiten Index'),
wobei man jeweils einen leer lassen kann. Zumal das Sortieren eines zweidimensionalen Arrays recht üblich sein wird. Bei komplexen Datenbank abfragen, die sich nur sehr schlecht, mit Order by sortieren lassen, bzw. um Taffic auf die DB zu vermeiden. Naja, nochmals vielen Dank.
Viele Grüße aus Oberschwaben (das muss jetzt auch mal da stehen) nach Berlin
Wolfgang