mehrdimensionales Array sortieren

Hallo zusammen,

irgendwie stoße ich gerade an die Grenzen meiner PHP-Fähigkeiten.

Ich habe hier ein mehrdimensionales Array, welches Temperaturwerte und die dazugehörigen Timestamps enthält. Nun möchte ich daraus den Min-Wert und den Max-Wert auslesen.

$Today = mktime( 0, 0, 0 );
$result = mysql_query("SELECT `VarID`, `TimeStamp`, `Value` FROM  $IPS_DB_TABLE WHERE `VarID` = '22107' AND `TimeStamp` > $Today ");
$row = mysql_fetch_array($result);

$arr = array();
$i = 0;

while ($row = mysql_fetch_array($result)){
  $arr[$i][0] = $row['TimeStamp'];
  $arr[$i][1] = $row['Value'];
  $i++;
}


foreach ( $arr as $zeile ){
  $sort_array[] = $zeile[1];
}
array_multisort($sort_array , $arr );

Array $arr sieht so aus:

Array
(
    [0] => Array
        (
            [0] => 1313273422
            [1] => 5.4
        )

    [1] => Array
        (
            [0] => 1313273735
            [1] => 5.6
        )

    [2] => Array
        (
            [0] => 1313274048
            [1] => 6
        )

    [3] => Array
        (
            [0] => 1313274361
            [1] => 6.4
        )

    [4] => Array
        (
            [0] => 1313274674
            [1] => 6.8
        )

    [5] => Array
        (
            [0] => 1313274987
            [1] => 7.2
        )

    [6] => Array
        (
            [0] => 1313275300
            [1] => 7.5
        )

    [7] => Array
        (
            [0] => 1313275613
            [1] => 7.7
        )

    [8] => Array
        (
            [0] => 1313275926
            [1] => 8
        )

    [9] => Array
        (
            [0] => 1313276239
            [1] => 8.2
        )

    [10] => Array
        (
            [0] => 1313276588
            [1] => 8.4
        )

    [11] => Array
        (
            [0] => 1313276901
            [1] => 7.8
        )

Wenn ich das Script ausführe, werden die Werte zwar sortiert, aber die Timestamps gehen dabei verloren.

Ergebnis ist:

Array
(
    [0] => 5.0
    [1] => 5.1
    [2] => 5.2
    [3] => 5.3
    [4] => 6.1
    [5] => 6.8
    [6] => 7.1
    [7] => 7.1
    [8] => 7.5
    [9] => 7.8
    [10] => 7.9

(Die Werte hier sind fiktiv - will nur deutlich machen, wie es aussieht und das es mit den kleinsten Werten beginnt)

Ich suche also nach einer Möglichkeit, das Array nach Temperaturwert zu sortieren und gleichzeitig den größten Wert und den kleinsten Wert auszuwerten (incl. Timestamp).

Ich hoffe, mir kann jemand helfen?

Danke und Gruß,
Christoph

Hast Du nur diese beiden Inahlte?

Dann bau es als Assoziatives Array zusammen


while ($row = mysql_fetch_array($result)){ 
  $arr[$row['TimeStamp']] = $row['Value']; 
} 

Wenn kein Timestamp zweimal vorkommt klappt das.

Dann sortierst Du es mit PHP - asort - Array-Funktionen

asort($arr);

Dann kannst Du den ersten und letzten Wert aus dem Array als min und max raussuchen.

Ich habe es nicht getestet, aber mehr oder weniger sollte der Code stimmen …

Wenn es nicht klappt, sag Bescheid.

Gruß,

ernie

Hallo ernie,

Code posten und ihn editieren, wenn ich ihn aber schon in IPS kopiert habe, ist unfair :smiley:

Also, erst einmal vielen Dank dafür! Das funktioniert soweit erstmal und sieht jetzt so aus:

$Today = mktime( 0, 0, 0 );
$result = mysql_query("SELECT `VarID`, `TimeStamp`, `Value` FROM  $IPS_DB_TABLE WHERE `VarID` = '22107' AND `TimeStamp` > $Today ");
$row = mysql_fetch_array($result);

$arr = array();

while ($row = mysql_fetch_array($result)){
  $arr[$row['TimeStamp']] = $row['Value'];
}

asort($arr);

$Max = max($arr);
$Min = min($arr);

Ich habe jedoch noch eine Frage: Wie komme ich nun an den TimeStamp? Die Variablen $Max und $Min enthalten nur den „Value“.
Darüber hinaus muss ich den „Value“ noch irgendwie in Float konvertieren, der ist nur „ganzzahlig“, d.h. die Kommastellen fehlen.

Vielen Dank für Deine Hilfe,

Gruß,
Christoph

Hi Christoph,

die Suche hier im Forum funktiniert einwandfrei und ergibt folgenden, noch nicht wirklich alten Thread:

Sollte dieselbe Fragestellung sein, oder? :rolleyes::wink:

Gruß
Jens

nur die Timestamp von min und max?

$minTimestamp = key($arr[0]);
$maxTimestamp = key(end($arr));

Die restlichen Timestamps sind die Keys des Arrays:


foreach ($arr as $key => $value) {
   echo $key ."== ". $value;
}

Die Min und Max Werte sollten sich doch über SQL ganz leicht ermitteln lassen - für das ist es ja letztendlich da.


$result = mysql_query("SELECT `VarID`, max(`TimeStamp`), `Value` 
                       FROM  $IPS_DB_TABLE 
                       WHERE `VarID` = '22107' AND `TimeStamp` > $Today  
                       GROUP BY `VarID`, `Value`");

Hab allerdings (noch) keine MySQL DB, wo ich das mal kurz ausprobieren könnte…

Hallo zusammen,

zunächst erst einmal vielen Dank für Eure Antworten.

@Tetrapack:
Vielen Dank für den Verweis auf die Such-Funktion. Ich bin auch auf den von Dir verlinkten Thread gestoßen und glaube nicht, dass dieser der gleichen Fragestellung entspricht. Der User Attain möchte nur den kleinsten Wert, der in einer Spalte steht. Ich habe im ersten Posting in diesem Thread verdeutlicht, dass ich das bereits soweit schaffe, die Werte zu sortieren. Mir gehen jedoch die zu den Werten gehörenden TimeStamps verloren. Die Lösung vom User 1007 sortiert dort ebenfalls nur die benötigten Werte, der Rest geht verloren. User TetraPack schreibt, dass „array_multisort“ die Lösung ist, ohne jedoch ein Beispiel zu posten. Ich persönlich komme mit der Syntax dieses Befehls leider nicht klar, weshalb ich mir hier Hilfe erhofft habe.
Verbessere mich bitte, falls ich damit falsch liegen sollte.

@ernie:
Ich habe festgestellt, dass TimeStamps doppelt vorkommen. Außerdem werden die Max und Min nur ganzzahlig angezeigt. :frowning: Vielleicht hast Du eine Lösung parat, die auf meinem ursprünglichen Array aus Posting 1 basiert?

@Brownson:
Ich habe den Code mal eben im phpMyAdmin abgesetzt. Der Max-Wert kommt zwar, aber wohl für jeden gefundenen Datensatz. Von daher war das nicht die richtige Lösung. Trotzdem vielen Dank dafür!

@ALL:
Sorry, aber mit Arrays stehe ich echt auf Kriegsfuß… :frowning:

Gruß,
Christoph

Mir ist gerade eine Idee gekommen, welche auch funktioniert:


$Today = mktime( 0, 0, 0 );
$result = mysql_query("SELECT `VarID`, `TimeStamp`, `Value` FROM  $IPS_DB_TABLE WHERE `VarID` = '22107' AND `TimeStamp` > $Today "); 
$row = mysql_fetch_array($result);
$Anzahl = mysql_affected_rows();
$arr = array();
$i = 0;
$Max = 0;
$MaxTime = 0;
$Min = 200;
$MinTime = 0;

while ($row = mysql_fetch_array($result)){
  $arr[$i][0] = $row['TimeStamp'];
  $arr[$i][1] = $row['Value'];
  
  if ($arr[$i][1] >= $Max){
	 $Max = $arr[$i][1];
	 $MaxTime = $arr[$i][0];
  }
  
  if ($arr[$i][1] <= $Min){
    $Min = $arr[$i][1];
	 $MinTime = $arr[$i][0];
  }
  
  $i++;
}

echo "Max: " . $Max . " um " . $MaxTime . "
";
echo "Min: " . $Min . " um " . $MinTime . "
";

Geht vielleicht ein einigen Stellen noch eleganter, macht aber, was es soll.

Gruß,
Christoph

Diese Methode hatte ich auch kurz im Sinn, war mir aber bisher zu unschön :wink: Aber manchmal ist der unschöne Weg der einfachste und effektivste …

Wenn ich mal eine ruhige Minute habe, scheib’ ich euch noch ein Beispiel für Array multisort. Der Befehl ist ein bißchen tricky, sollte das aber können, was Du willst.

Wenn aus dem SQL Befehl das Ding für jeden Datensatz rauskommt, kann man das aber auch auf jeden Fall anpassen, das es stimmt …

Schön finde ich die Methode auch nicht, aber sie funktioniert.

Wäre nett, wenn Du bei Gelegenheit noch mal ein Beispiel erstellen könntest.

Danke und Gruß,
Christoph

Hmmm … ich hatte in dem genannten Thread aber ein Beispiel angegeben! :rolleyes:

Ne Anleitung kann ich dir dazu allerdings nicht schreiben … :wink:

Jens

Einen Versuch hät ich auch noch:


$result = mysql_query("SELECT `VarID`, `TimeStamp`, `Value` 
                         FROM  $IPS_DB_TABLE 
                        WHERE `VarID` = '22107' 
					      AND `TimeStamp` = (SELECT max(`TimeStamp`) 
						                      FROM $IPS_DB_TABLE 
						                     WHERE `VarID` = '22107' 
											   AND `TimeStamp` > $Today)");  

Hallo Brownson,

vielen Dank dafür, das funktioniert! Ich suche jedoch den Maximal-Temperaturwert. Habe es von daher umgewandelt in:


$result = mysql_query("SELECT `VarID`, `TimeStamp`, `Value` 
                         FROM  $IPS_DB_TABLE 
                        WHERE `VarID` = '22107' 
					      AND `Value` = (SELECT max(`Value`) 
						                      FROM $IPS_DB_TABLE 
						                     WHERE `VarID` = '22107' 
											   AND `TimeStamp` > $Today)");  

Das Script läuft und tut was es soll, jedoch braucht das Script dadurch komischerweise länger :confused:

@Tetrapack:
Ich habe mich mal ein wenig näher mit Arrays beschäftigt. Ich glaube, ich kann Dein Beispiel aus dem anderen Thread nun auf meine Umgebung übertragen. Werde es probieren und mich hier melden.

Gruß,
Christoph

Hallo zusammen,

ich bin bei meiner Lösung geblieben.

Das Beispiel von Tetrapack habe ich soweit hinbekommen, dass ich die Werte im Array zwar sortiert bekommen habe, mir jedoch der TimeStamp dabei auf der Strecke geblieben ist.

Trotzdem noch einmal vielen Dank an alle, die geholfen haben!

Gruß,
Christoph