Ankündigung

Einklappen
Keine Ankündigung bisher.

Array durchlaufen und Rechnen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Array durchlaufen und Rechnen

    Hallo zusammen,

    und zwar habe ich ein Array mit 20 Temperaturwerten, das ich aus einer csv-Datei erhalte und wie folgt aussieht:

    Code:
     22.10.2017 20:11;21,6;25;25,1;27,5;34,1;34,4;34,4;34,7;34,8;34,9;35,4;36,6;38,1;38,5;41,6;77;77,4;77,3;77,8;77,7
    Zuerst einmal möchte ich, dass der Zeitstempel ignoriert wird und die Werte in aufsteigender Reihenfolge sortiert werden.

    Dann möchte ich, dass im ersten Schritt die Werte unterhalb von 30°C folgendermaßen aufsummiert werden:

    Code:
    Wert unterhalb = (25,1°C - 21,6°C) * 4,2 * 1,7 + (27,5°C - 25,1°C) * 4,2 * 1,7
    Und im zweiten Schritt die Werte oberhalb von 30°C, beginnend mit:

    Code:
    Wert oberhalb = (34,4°C - 34,1°C) * 4,2 * 1,7 + (34,4°C - 34,4°C) * 4,2 * 1,7 + ... + (77,8°C - 77,7°C) * 4,2 * 1,7
    Ich bin bisher nur soweit gekommen, dass ich mir die Werte unterhalb bzw. oberhalb ausgeben lassen kann:

    PHP-Code:
    for($i=0$i<count($array_letzte); $i++) {
        if(
    $array_letzte[$i] <= 30) {

             echo 
    $array_letzte[$i];
        }

    Wie setze ich die genannte Rechnung um? Ich stehe leider total auf dem Schlauch.

    Viele Grüße
    Kowen


  • #2
    Im Grunde gehören die Schritte die du angeführt hast in der Form so umgesetzt. Was fehlt dir dabei? Die Array-Funktionen findest du im Handbuch. Sonst bitte konkretes Problem aufzeigen, dann kann man dir auch helfen.

    Zuerst einmal möchte ich, dass der Zeitstempel ignoriert wird und die Werte in aufsteigender Reihenfolge sortiert werden.
    Mal als erster Schritt für dich hier getippt, Funktionen aus dem ff.. ev. gibts auch bessere, aber wie gesagt, als Ansatz mal:

    Achtung!
    Bei der Sortierung muss du genau schauen, wenn du auch einstellige oder negative Temperaturen hast. Dann musst du vermutlich eine der anderen Sort-Funtkionen nehmen, oder mit usort() eine eigene bauen. Das mit Komma hier sind eigentlich blöde Werte, weil keine richtigen Floats. Ev. ersetzt du die Kommas auch vor dem explode() einfach durch Punkte, dann müsste es auch hinhauen, wenn es nicht sehr sauber ist.

    PHP-Code:
    $csv '22.10.2017 20:11;21,6;25;25,1;27,5;34,1;34,4;34,4;34,7;34,8;34,9;35,4;36,6;38,1;38,5;41,6;77;77,4;77,3;77,8;77,7';

    $aTemp explode(';'$csv);
    $aTemp array_slice($aTemp1);
    sort($aTemp);

    print_r($aTemp);
    /*
    Array
    (
        [0] => 21,6
        [1] => 25
        [2] => 25,1
        [3] => 27,5
        [4] => 34,1
        [5] => 34,4
        [6] => 34,4
        [7] => 34,7
        [8] => 34,8
        [9] => 34,9
        [10] => 35,4
        [11] => 36,6
        [12] => 38,1
        [13] => 38,5
        [14] => 41,6
        [15] => 77
        [16] => 77,3
        [17] => 77,4
        [18] => 77,7
        [19] => 77,8
    )
    */ 
    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3

      Hier nochmals was ich meinte, schau das 5,2 wo das steht Und zum Rechnen brauchst du entweder floats oder du nutzt die bcmath Funktionen.

      PHP-Code:
      $csv '22.10.2017 20:11;5,2;-10;21,6;25;25,1;27,5;77,7';

      $aTemp explode(';'$csv);
      $aTemp array_slice($aTemp1);

      sort($aTemp);
      print_r($aTemp);

      /*
      Array
      (
          [0] => -10
          [1] => 21,6
          [2] => 25
          [3] => 25,1
          [4] => 27,5
          [5] => 5,2     ### HIER an falscher Stelle ###
          [6] => 77,7
      )
      */

      ## VS ##

      $csv str_replace(',''.'$csv);
      $aTemp explode(';'$csv);
      $aTemp array_slice($aTemp1);

      sort($aTemp);
      print_r($aTemp);
      /*
      Array
      (
          [0] => -10
          [1] => 5.2  ## Hier korrekt ##
          [2] => 21.6
          [3] => 25
          [4] => 25.1
          [5] => 27.5
          [6] => 77.7
      )
      */ 
      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Mathematisch müsstest Du das auch vereinfachen können.

        1. Es ist ja immer die Summe in Klammern * 4,2 * 1,7. Das kann man ja schon mal auf * 7,14 abkürzen.
        2. Zudem ist in der Folge bis auf den ersten und den letzten jedes Element mal positiver mal negativer Summand, so dass die eigentlich rausfallen können.

        Wenn ich mich nicht irre, müsstest Du die Rechnung so vereinfachen können: (Größter Wert - Kleinster Wert) * 7,14

        Das jetzt angewendet auf die Werte unter 30 und darüber eben.
        Es ist schon alles gesagt. Nur noch nicht von allen.

        Kommentar


        • #5
          Viele Dank schonmal für eure Antworten.

          Zitat von hausl Beitrag anzeigen
          Sonst bitte konkretes Problem aufzeigen, dann kann man dir auch helfen.
          Ich war vielleicht etwas unpräzise. Die Temperaturwerte kommen von Sensoren und diese Werte ändern sich. Damit dann auch die Stellen des Arrays die unter- bzw. oberhalb von 30°C sind.

          Für die Rechnung brauche ich, dass er dann immer (Sensorwert [x] - Sensorwert [x-1]) * 7,14 nimmt und bei der Grenze kleiner 30°C aufhört. Das gleiche für größer 30°C.

          Das verstehe ich nicht, wie man das umsetzen kann?


          Vielleicht ist das nochmal verständlicher, wenn ich das so aufzeige:

          PHP-Code:
          $i=0;
          $x=0;

          while(
          $i count($aTemp)) {
              if (
          $aTemp <= 30) {

              
          $unterhalb bcadd(($aTemp[$x] - $aTemp[$x-1]) * 7,14);

              
          $x++;

              }

              if (
          $aTemp 30) {

              
          $oberhalb bcadd(($aTemp[$x] - $aTemp[$x-1]) * 7,14);

              
          $x++;

              }
              
          $i++;
          }

          echo 
          $unterhalb;
          echo 
          $oberhalb
          Falls das so funktioniert, was setze ich für "$x", bzw. "$x-1" ein, dass er dann den jeweils nächsten Sensor nimmt?


          Zitat von hausl Beitrag anzeigen
          Achtung!
          Bei der Sortierung muss du genau schauen, wenn du auch einstellige oder negative Temperaturen hast. Dann musst du vermutlich eine der anderen Sort-Funtkionen nehmen, oder mit usort() eine eigene bauen. Das mit Komma hier sind eigentlich blöde Werte, weil keine richtigen Floats. Ev. ersetzt du die Kommas auch vor dem explode() einfach durch Punkte, dann müsste es auch hinhauen, wenn es nicht sehr sauber ist.
          Negative Werte werden nicht vorkommen, aber das mit dem Komma erübrigt sich. Die Werte liegen mit Punkt vor - mein Fehler.

          Kommentar


          • #6
            Das Script muss natürlich dann schon auch immer deine Werte aus das CSV verarbeiten, das oben mir den fixen Werten war logischerweise nur ein Beispiel für dich.
            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
            PHP.de Wissenssammlung | Kein Support per PN

            Kommentar


            • #7
              In #4 wurdest Du doch schon von drsoong darauf hingewiesen, dass es reicht, das erste Element vom letzen Element abzuziehen.

              Demnach müsste doch folgendes reichen, habe das mit dem Punkt jetzt nicht geändert weil aus #1 kopiert.

              PHP-Code:
              <?php
              $myCSV 
              "22.10.2017 20:11;21,6;25;25,1;27,5;34,1;34,4;34,4;34,7;34,8;34,9;35,4;36,6;38,1;38,5;41,6;77;77,4;77,3;77,8;77,7";
              $myMeasurements str_replace(',''.',array_slice(explode(';'$myCSV),1));
              $myMeasurements=array_map('floatval'$myMeasurements);
              sort($myMeasurements);

              foreach (
              $myMeasurements as $key => $item)if ($item 30) break;

              $under = (($myMeasurements[$key-1]-$myMeasurements[0])*7.14);
              $over = ((end($myMeasurements)-$myMeasurements[$key])*7.14);

              Kommentar


              • #8
                Super, vielen Dank! Klappt wunderbar.

                Kommentar

                Lädt...
                X