Antje Hofmann: alle ARRAY's nach einem ARRAY sortieren ?

Beitrag lesen

Hallo Chris,

ich frage eine Datei mit Arrays ab. In dem ersten Arry befinden sich Datum und in den anderen die dazugehörigen Daten.

Wie kann ich alle Arrays gleich sortieren?

Also ich sortiere alle nach Datum, die anderen Arrays müssen aber auch in der selben Reihenfolge mit sortiert werden.

Am Besten geht es natürlich, wenn die Arrays in einem mehrdimensionalen Array zusammengefasst sind, deren erstes Element dein Zeitstempel ist.

Dann geht es mit einer einfachen Vergleichsfunktion:

<?php

$a = array(array(12,"12a","12c","12d"),
        array(35,"35a","35c","35d"),
             array(45,"45a","45c","45d"),
             array(11,"11a","11c","11d"),
             array(13,"13a","13c","13d"));

usort($a,"mySort");

function mySort($first,$second) {
    return $first[0]>$second[0];
  }

var_dump($a);

?>

usort sortiert Arrays mit anhand einer Vergleichsfunktion. Du musst hier noch die einzelnen Werte miteinander vergleichen.

Schwieriger ist es schon, wenn mehrere Arrays vorliegen. Du kannst diese natürlich zu einem Array zusammenfassen und dann wieder die Mehrdimensionalität verwenden.

<?php

$z = array_map(null,$a,$b,$c,$d);
  usort($z,"mySort");

var_dump($z);
?>

Du kannst mit array_map die verschiedenen Arrays zusammenfassen. Das Ergebnis ist das gleiche wie in Lösung 1.

Sollte es zwingend erforderlich sein, dass die Variablen erhalten bleiben, kannst du so vorgehen:

Du sortierst dein Array mit dem Datumswerten mit der Funktion asort(); Bei dieser Sortierung bleiben die Indexwerte erhalten. Die anderen Arrays bleiben unsortiert.

<?php
  $a = array(12,35,45,11,13);
  $b = array("12a","35a","45a","11a","13a");
  $c = array("12c","35c","45c","11c","13c");
  $d = array("12d","35d","45d","11d","13d");

asort($a,SORT_NUMERIC);

foreach ($a as $key => $value)
   echo $b[$key];
?>

Über den Schlüssel kannst du dann auf die Elemente der anderen Arrays zugreifen.

Sollte es zwingend erforderlich sein, dass auch die anderen Arrays sortiert werden, bietet sich die folgende Lösung an:

Du sortiert $a so, dass die Schlüssel erhalten bleiben. Dann müsstest du jedes weitere Array entsprechend bearbeiten.

Eine Lösungsmöglichkeit besteht darin, Alle nicht sortierten Arrays mit compact in ein assoziatives Array zu überführen.

<?php

$a = array(12,35,45,11,13);
  $b = array("12a","35a","45a","11a","13a");
  $c = array("12c","35c","45c","11c","13c");
  $d = array("12d","35d","45d","11d","13d");

asort($a,SORT_NUMERIC);

$t = compact("b","c","d");

function myVarSort2($item, $key, &$t) {
    $v = array_keys($t);
    for ($i = 1;$i<count($v);$i++)
     if ($key != $item)  {
       $temp = $t[$v[$i]][$key];
       $t[$v[$i]][$key] = $t[$v[$i]][$item];
       $t[$v[$i]][$item] = $temp;
    }
  }

array_walk(array_keys($a),"myVarSort2",&$t);
  extract($t);

$a = array_values($a);

var_dump($a,$b,$c,$d);
?>

Dann wird die Funktion array_walk() auf alle Schlüssel des Arrays $a (die erhälst du mit array_keys()) angewendet. Diese Funktion wendet eine Callbackfunktion auf alle Elemente eines Arrays an. Der Callbackfunktion werden als Parameter der Elementwert ($item == dem Schlüssel), der Index ($key == Position im Array) und als optionales drittes Element das Array $t übergeben. Die Übergabe erfolgt als Referenz, das heist jede Änderung im Array $t wird auch in der globalen Variable wirksam.

Dann erfolgt ein einfaches Tauschen der Elemente und anschließend werden die Arrayelemente mit extract in Arrays überführt. Alle Arrays liegen jetzt gleich sortiert vor. Zum Schluss wird das Array $a noch neu indiziert, und alle Arrays sind wie gewünscht sortiert.

Müßte ich eine Lösung wählen, würde ich mich für die erste oder die zweite Variante entscheiden. Alle anderen würde ich nur im äußersten Notfall wählen.

Viele Grüße

Antje