Rolf B: Array Max Min ermitteln und zusammensetzen

Beitrag lesen

Hallo WernerK,

das geht mit min und max nicht. Muss die Reihenfolge der Einträge in $time_arr[$key] unverändert bleiben? Ist es tatsächlich so, dass die Indexe nicht bei 0 beginnen?

Zuerst mal einfache Lösungen mit Sortieren - die allerdings die Reihenfolge der Einträge im Timestamp-Array zu myname verändern. Je nach dem, wie man sortiert, könnte das aber kein Problem sein. Das musst Du beurteilen.

  1. Verwende sort($time_arr[$key]). Nachteil: Die Indexe lauten nachher nicht 27,28,29, sondern 0,1,2. Du findest den kleinsten Wert am Index 0, den größten Wert am Index 2 (also count($time_arr[$key])-1), und kannst die Stunde subtrahieren/addieren.

  2. Verwende asort($time_arr[$key]). Der sortiert die Indexe mit. Ja, richtig gelesen. Ein PHP Array hat eine Reihenfolge, die von den Indexwerten unabhängig ist (-> Doku). Wenn Du vorher Indexe 27,28,29 hattest, der kleinste Wert auf 28 steht und der größte auf 27, ist die Indexreihenfolge im Array nachher 28,29,27. Wenn Du das Array in Sortierfolge verarbeiten willst, nimmst Du foreach ($time_arr[$key] as $i => $ts). Den ersten Index bekommst Du mit array_key_first, den letzten mit array_key_last, und kannst dort die Stunde subtrahieren/addieren

  3. Mach es von Hand - dann bleiben die Indexe so wie sie sind, und nur der kleinste und größte Wert werden verändert:

Da ich nicht weiß, wie deine Timestamps tatsächlich gespeichert sind, habe ich die Addition/Subtraktion der Stunde als Kommentar hingeschrieben, das wirst Du selbst können.

// Code aus der Hüfte geschossen, bitte selber testen.
function expand_min_max(&$arr) {
   $minPos = 0;
   $lastIndex = count($arr)-1;
   $maxPos = $lastIndex;
   for ($i=0; $i<=$lastIndex; $i++) {
      if ($arr[$i] < $arr[$minPos])
         $minPos = $i;
      else if ($arr[$i] > $arr[$maxPos])
         $maxPos = $i;
   }
   $arr[$minPos] = // $arr[$minPos] minus eine Stunde
   $arr[$maxPos] = // $arr[$maxPos] plus eine Stunde
}

// Und an der Stelle, wo Du es tun musst:

expand_min_max($fooArray[$username]);

Die Funktion empfängt einen Referenzparameter, d.h. wenn in $fooArray[$username] dein myname Array gespeichert ist, dann bekommt die aufgerufene Funktion die Möglichkeit, die Werte dieses Arrays zu ändern. Normalerweise lässt PHP das nicht zu, es übergibt eine Kopie[1]. D.h. wenn die Funktion zurückkehrt, ist das Array in $fooArray[$username] passend verändert.

Wenn Du $fooArray[$username] nicht verändern willst, lass das & vor dem Parameter weg und gib das veränderte Array mit return zurück.

Rolf

--
sumpsi - posui - clusi

  1. Okay, so etwas ähnliches wie eine Kopie. Übergeben wird ein Verweis auf das Array, das geht schnell und ohne Overhead, und der erste schreibende Zugriff erzeugt die Kopie. Das & vor dem Parameter von expand_min_max verhindert diesen Copy-On-Write Mechanismus und erlaubt die Manipulation des übergebenen Arrays. ↩︎