PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehrdimensionales Array sortieren


MrLongbaugh
01.11.2005, 16:23:48
Hallo,

das Sortieren von Arrays scheint immer wieder Thema zu sein. So auch bei mir.

Ich habe ein Array in der Form:

Array
(
[0] => Array
(
[0] => Titel1
[1] => 4
[2] => 2
)

[1] => Array
(
[0] => Titel2
[1] => 7
[2] => 5
)

[2] => Array
(
[0] => Titel3
[1] => 15
[2] => 0
)

[3] => Array
(
[0] => Titel4
[1] => 17
[2] => 6
)
)


Nun möchte ich das Array nach dem 2. Wert des zweiten Arrays sortieren.

Probiert habe ich das mit (Array steht in $data)

array_multisort ($data[2], SORT_ASC, SORT_NUMERIC);

Dies greift auf $data[2] zu und nicht auf $data[][2].

Wie kann ich nun aber danach sortieren?
Das Ergebnis sollte so aussehen:

Array
(
[2] => Array
(
[0] => Titel3
[1] => 15
[2] => 0
)

[0] => Array
(
[0] => Titel1
[1] => 4
[2] => 2
)

[1] => Array
(
[0] => Titel2
[1] => 7
[2] => 5
)

[3] => Array
(
[0] => Titel4
[1] => 17
[2] => 6
)
)

xabbuh
01.11.2005, 19:59:35
Dafür musst du zunächst ein Array erstellen, das aus den jeweiligen Werten besteht:

<?php
$sortArray = array();
foreach($data as $key => $array) {
$sortArray[$key] = $array[2];
}

array_multisort($sortArray, SORT_ASC, SORT_NUMERIC, $data);
?>

MrLongbaugh
02.11.2005, 10:58:25
Hallo xabbuh,

danke für die Antwort.

Ich glaube, ich habe mein Problem sagen wir mal suboptimal beschrieben.
Hier nun ein neuer Versuch:

Das gegebene Array soll neu sortiert werden. Dabei soll sich die Reihenfolge der Arrays der ersten Dimension ändern. Das Sortierkriterium soll der zweite Wert der zweiten Dimension ( etwa so $data[][2), SORT_ASC, SORT_NUMERIC) sein. Diesen kann ich jedoch per Multisort nicht ansprechen.

Die Reihenfolge der Array[1]- Array[5]wie die Zielvorgabe s.o.

Ich hoffe mich nun verständlicher ausgedrückt zu haben.

Danke für die Geduld

xabbuh
02.11.2005, 13:13:10
Genau das sollte mein Script auch tun. Hast du es mal getestet?

MrLongbaugh
02.11.2005, 13:51:12
mea culpa, mea maxima culpa.

Danke.
Genau so funktionierts.
Genau verstanden habe ich das ehrlich gesagt noch nicht, muss es mir noch mal in Ruhe ansehen.

Danke für Deine Mühe.

evil_knievel
08.10.2007, 16:02:25
Hallo,

dieser Thread ist zwar ziemlich alt, aber ich habe genau das gleiche Problem, nur diese Lösung funktioniert bei mir nicht.

Mein Array heisst arr_prodopt und sieht ähnlich aus (blaah sind irgendwelche Werte)

Array
(
[0] => Array
(
[0] => blaah
[1] => blaah
[2] => blaah
[3] => blaah
[4] => blaah
[5] => blaah
[6] => 127
[7] => blaah
)

[1] => Array
(
[0] => blaah
[1] => blaah
[2] => blaah
[3] => blaah
[4] => blaah
[5] => blaah
[6] => 629
[7] => blaah
)

[2] => Array
(
[0] => blaah
[1] => blaah
[2] => blaah
[3] => blaah
[4] => blaah
[5] => blaah
[6] => 42
[7] => blaah
)
usw ...
)

Nun will ich sortieren:

$sort_prodopt = array();
foreach($arr_prodopt as $key => $array) {
$sort_prodopt[$key] = $array[6];
}

array_multisort($sort_prodopt, SORT_ASC, SORT_NUMERIC, $arr_prodopt);

aber das geht nicht.

Kann mir vielleicht jemand sagen was ich falsch mache?

rambi
08.10.2007, 17:13:34
Nöö..
Ich verwende für sowas meist usort()....

evil_knievel
09.10.2007, 10:34:50
OK OK,

habe Usort probiert aber wie es halt so ist funktioniert es nicht ganz:

function _compare($a, $b) {
return ($a == $b ? strcmp($a[5], $b[5]) : strcmp($a[6], $b[6]));
}

array ...

usort($arr_prodopt, "_compare");


1. sortiert er für mich falsche (z.B. kommt 50 nach 490) : 1, 10, 2, 20 ... 490, 50
liegt das an strcmp, weil es für Strings ist? Habe für Integer bzw Zahlen da nichts gefunden.

2. wie sortiere ich erst nach Stelle 6 und dann nach Stelle 5 vom Array:

Beispiel:

array (blaah, blaah, blaah, blaah, blaah, 2, 100)
array (blaah, blaah, blaah, blaah, blaah, 1, 100)
array (blaah, blaah, blaah, blaah, blaah, 20, 50)
array (blaah, blaah, blaah, blaah, blaah, 10, 50)

mit dem Ergebnis:

array (blaah, blaah, blaah, blaah, blaah, 10, 50)
array (blaah, blaah, blaah, blaah, blaah, 20, 50)
array (blaah, blaah, blaah, blaah, blaah, 1, 100)
array (blaah, blaah, blaah, blaah, blaah, 2, 100)

evil_knievel
09.10.2007, 10:40:06
Hab einen besseren Code gefunden, damit ist Prob 1 gelöst, aber Prob 2 leider noch nicht:

function cmp ($a, $b) {return $a[6] > $b[6]; }

evil_knievel
09.10.2007, 10:52:13
Ich habs, für alle die es interessiert:

function _cmp ($a, $b)
{
if ( $a[5] == $b[5] )
{
if ($a[6] == $b[6])
return 0;
else
return ( $a[6] < $b[6] ) ? -1 : +1;
}
else
return ( $a[5] < $b[5] ) ? -1 : +1;
}

Thomas-
06.03.2008, 13:02:47
Ich habe ein recht ähnliches Problem, nur möchte ich nach beiden Spalten sortieren.

Array
(
[a] => Array
(
[0] => 109
[1] => 15
)
[b] => Array
(
[0] => 109
[1] => 16
)
[c] => Array
(
[0] => 110
[1] => 15
)
[j] => Array
(
[0] => 8
[1] => 3
)
[p] => Array
(
[0] => 3
[1] => 3
)
[z] => Array
(
[0] => 94
[1] => 14
)
}

Sortiert soll es nun nach der Spalte [0] abwärts und nach der Spalte [1] aufwärts werden. d.h. Ist der Wert [0] gleich, so soll die Zeile mit dem kleineren Wert [1] weiter vorne stehen.

Array
(
[c] => Array
(
[0] => 110
[1] => 15
)
[b] => Array
(
[0] => 109
[1] => 16
)
[a] => Array
(
[0] => 109
[1] => 15
)
[z] => Array
(
[0] => 94
[1] => 14
)
[j] => Array
(
[0] => 8
[1] => 3
)
[p] => Array
(
[0] => 3
[1] => 3
)
}

Ich könnte das Array auch anders gestalten, also
Array
(
[0] => Array
(
[a] => 109
[b] => 109
[c] => 110
)
[1] => Array
{
[a] => 15
[b] => 16
[c] => 15
}
}

Ziel
[0] => Array
(
[c] => 110
[a] => 109
[b] => 109
)
Letzlich ist die Zeite Spalte nur eine Hilfsspalte und würde im Ausgabe nicht mehr benötigt, jedoch soll eben Array a vor Array b stehen auch, wenn beide Werte gleich groß sind.