Ankündigung

Einklappen
Keine Ankündigung bisher.

was mache ich falsch ?

Einklappen

Neue Werbung 2019

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

  • was mache ich falsch ?

    Hallo !

    Ich versuche mich mal wieder an PHP, Ziel ist es einen script zu schreiben der Laufzeiten addiert und anschliessend den Mittelwert errechnet.
    Die Quelldaten sind im Format:
    1 08:11:28
    1 08:11:09
    0 08:11:04
    0 08:08:01
    Wobei die erste Zahl die Anzahl der Tage wiedergibt und der Rest Stunden:Minuten:Sekunden.

    Als ersten Schritt habe ich das Leerzeichen zwischen 1 und 08 durch einen Doppelpunkt ersetzt:


    PHP-Code:

    <?php

    $data 
    $_POST['data'];

    $repl str_replace(' ',':',$data);
    $tagsAsArray explode(' '$repl);
    var_dump ($tagsAsArray);


    ?>
    Ergibt Ausgabe:
    array(1) { [0]=> string(4 "1:08:11:28 1:08:11:09 0:08:11:04 0:08:08:01 " }

    Irgendwie funktioniert der explode aber nicht, ich hätte gerne die Einträge einzeln um sie zum einen mit Zeilenumbruch zu listen, zum anderen um sie zu addieren.
    Wo liegt mein Denkfehler ? Jemand eine Idee ?

    Grüßle

  • #2
    1. Schlechter Titel "was mache ich falsch ?"


    2.

    PHP-Code:
    $repl str_replace(' ',':',$data);
    $tagsAsArray explode(' '$repl); 
    Du ersetzt ein Leerzeichen zu deinem Doppelpunkt und explodest dann aber nach Leerzeichen. Da gibt es dann aber keine Leerzeichen mehr.


    Wenn du preg_split() nimmst, kannst du nach beiden Zeichen in einem Rutsch splitten. Beispiel:

    PHP-Code:
    $s '1 08:11:28';
    $a preg_split('/[ :]/'$s);

    print_r($a);
    /*
    Array
    (
        [0] => 1
        [1] => 08
        [2] => 11
        [3] => 28
    )
    */ 
    The string "()()" is not palindrom but the String "())(" is.

    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
      Ok, Danke. Aber wie kriege ich die Einzeleinträge voneinander getrennt ?

      array(1) { [0]=> string(4 "1:08:11:28 1:08:11:09 0:08:11:04 0:08:08:01 " }


      also 1:08:11:28 von 1:08:11:09, da ist doch ein Leerzeichen dazwischen, oder sind das bereits Einzelelemente ?

      Kommentar


      • #4
        Nein, bitte oben meinen Post lesen. Und die Ausgabe bei dir zeigt es ja deutlich. Du hast einen einzigen langen String mit 48 Stellen, weil du oben falsch explodest. Du musst meinen Post auch lesen und verstehen.
        The string "()()" is not palindrom but the String "())(" is.

        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


        • #5
          Zitat von BarneBock Beitrag anzeigen
          also 1:08:11:28 von 1:08:11:09, da ist doch ein Leerzeichen dazwischen, oder sind das bereits Einzelelemente ?
          Das müsstest du eigentlich wissen, du bist der einzige hier der weiß wo die Daten her kommen - ich würde aber mal darauf tippen dass das keine Leerzeichen sondern Zeilenumbrüche sind?

          Kommentar


          • #6
            aus einem Formular. die Daten werden aus Excel Tabellen rauskopiert.

            2019-11-19 10_33_55-Window.png

            HTML-Code:
            <form action="script.php" method="post">
            
            <textarea cols="20" name="data" rows="30"></textarea>
            <input type="Submit" value="Absenden" />
            
            </form>
            PHP-Code:
            <?php

            $data 
            $_POST['data'];

            $repl str_replace(' ',':',$data);
            $a preg_split('/[ ]/'$repl);


            print_r($a).'<br>\n';


            echo 
            count($a).' Einträge verarbeitet';

            ?>
            PHP-Code:
            Array ( [0] => 1:08:11:28 0:08:02:23 1:09:11:24 2:08:00:28 
            Sind das jetzt Leerzeichen oder Zeilenumbrüche ? Muß ich die Daten in ein neues Array packen nachdem ich die Doppelpunkte hinzugefügt habe ? Ich verstehe nicht wie ich den String splitten kann, sodass ich die Einzelelemente, z.b. "0:08:02:23" = 1 element auf Variablen packen kann um Selbige später zu zählen. Diese Elemente muss ich dann nochmal in Ihre Bestandteile zerlegen um z.b. die zweite Position, also 00:XX:00:00 abzugleichen, alle unter 4h zusammenzählen und dann den % Anteil ermitteln.
            Ich stehe vollkommen auf dem Schlauch und keine Website erklärt mir verständlich was zu tun ist. Count etc funzt nicht, wahrscheinlich bin ich einfach zu doof dafür.

            Kommentar


            • #7
              Zitat von BarneBock Beitrag anzeigen
              Sind das jetzt Leerzeichen oder Zeilenumbrüche ?
              ..oder sind da noch Tab's dabei wie bei mir und was für Zeilenumbrüche sind es? Kann sein, das dies noch von der Excel-Version bzw. den Einstellungen abhängt.
              Sollte aber als Erstes geklärt werden was da genau als Data ankommt. print_r und var_dump zeigen dir da nicht genug.

              Variante 1: $data mit file_put_contents() in eine Datei ablegen und das ganze mit einem Hexeditor anschauen.

              Variante 2: class.debug.php herunterladen und einbinden. Mit debug::write($data) erhälts du eine Ausgabe wie "\r\n1\t08:11:28\r\n0\t08:02:23\r\n" wo du genau erkennen kannst was als Trenner benutzt wird.

              Edit: Frage am Rande. Bietet XDebug da Möglichkeiten spezielle Steuerzeichen zu erkennen?

              Kommentar


              • #8
                Die Ausgabe von Variante 1:
                HTML-Code:
                1 08:11:28
                0 08:02:23
                1 09:11:24
                2 08:00:28




                Kommentar


                • #9
                  Zitat von BarneBock Beitrag anzeigen
                  Die Ausgabe von Variante 1:
                  HTML-Code:
                  1 08:11:28
                  0 08:02:23
                  1 09:11:24
                  2 08:00:28



                  PHP-Code:

                  <?php
                  if(isset($_POST['data'])){
                      
                  $data $_POST['data'];

                      
                  $re '/(?<zahl>\d+)\s(?<stunde>\d+):(?<minute>\d+):(?<sekunde>\d+)\n?/m';
                      
                  $matches = [];
                      if(
                  preg_match_all($re$data$matchesPREG_SET_ORDER0)){
                          foreach(
                  $matches as $match){
                              echo 
                  $match['zahl']; //das was am Anfang steht
                              
                  echo $match['stunde'];//erste zahl vor :
                              
                  echo $match['minute'];//mittlere Zahl
                              
                  echo $match['sekunde'];//letzte Zahl

                          
                  }


                      }

                      echo 
                  count($matches) . ' Einträge verarbeitet';

                  }
                  ?>
                     <form action="test.php" method="post">

                          <textarea cols="20" name="data" rows="30"></textarea>
                          <input type="Submit" value="Absenden" />

                      </form>
                  apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                  Kommentar


                  • #10
                    Danke für Eure Hilfe, bzw auch den letzten Script.

                    Ich habe das Teil etwas weitergbastelt und die Filterabfrage eingebaut.
                    Der script filtert nun alles was genau 4 minuten und unter 4 minuten ist und alles was mehr ist.

                    PHP-Code:
                    <?php
                    if(isset($_POST['data'])){
                        
                    $data $_POST['data'];

                        
                    $re '/(?<tage>\d+)\s(?<stunde>\d+):(?<minute>\d+):(?<sekunde>\d+)\n?/m';
                        
                    $matches = [];

                        if(
                    preg_match_all($re$data$matchesPREG_SET_ORDER0)){
                            foreach(
                    $matches as $match){
                                echo 
                    '</br>'.$match['tage'].':';
                                echo 
                    $match['stunde'].':';
                                echo 
                    $match['minute'].':';
                                echo 
                    $match['sekunde'];

                            }
                        }

                        if ((
                    $match['tage']) == (0) AND ($match['stunde']) == (4) AND ($match['minute']) == (00) AND ($match['sekunde']) == (00)){
                            echo 
                    '</br></br>kleiner oder gleich als 4:'.count ($match['stunde']);
                        }
                        elseif ((
                    $match['tage']) == (0) AND ($match['stunde']) < (4)){
                            echo 
                    '</br></br>kleiner oder gleich als 4:'.count ($match['stunde']);
                        }

                        else {
                            echo 
                    '</br></br>größer als 4:';

                        }

                    echo 
                    '</br></br><b>'.count($matches) . '</b> Einträge verarbeitet';
                        }
                    ?>
                    Was mir allerdings noch fehlt und was ich nicht genau verstehe an welcher Stelle des Codes das muß, ist ein Zähler "Wieviele $matches erfüllen die Bedingung UNTER 4 Minuten" (also "kleiner oder gleich 4")
                    Vermutlich muß das in die foreach schleife, oder in einer weiteren foreach schleife welche innerhalb der schon existierenden liegen muß ?


                    (Ja, ich habe die Doppelpunkte wieder eingebaut, da ich $re Wahnsinn nicht verstehe, eben so)
                    Mir raucht der Schädel.

                    Grüßle

                    Kommentar


                    • #11
                      Ja das musst noch programmieren. Würde alles in Minuten umrechnen dann kannst direkt vergleichen und ausgeben was dem entspricht.

                      Und ja.. In einer Schleife.
                      The string "()()" is not palindrom but the String "())(" is.

                      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


                      • #12
                        Hallole !

                        Habe es geschafft *party*, allerdings hat der script ein Problem wenn einer der frei Fälle:

                        a. Zeit ist größer als 4 Minuten
                        b. Zeit ist genau 4 Minuten
                        c. Zeit ist unter 4 Minuten

                        mehr als einmal vorkommt. Jetzt stehe ich wiederauf dem Schlauch und hoffe ihr habt einen Tip für mich.
                        Hier mein script:

                        PHP-Code:
                        <?php
                        if(isset($_POST['data'])){
                            
                        $data $_POST['data'];

                            
                        $re '/(?<days>\d+)\s(?<hours>\d+):(?<minutes>\d+):(?<seconds>\d+)\n?/m';
                            
                        $matches = [];
                            
                        $filters1 = [];
                            
                        $filters2 = [];
                            
                        $filters3 = [];

                            if(
                        preg_match_all($re$data$matchesPREG_SET_ORDER0)){
                                echo 
                        '<div id="list">Deine Eingabe:</br></br>';

                            foreach(
                        $matches as $match){        
                                echo 
                        $match['days'].':';
                                echo 
                        $match['hours'].':';
                                echo 
                        $match['minutes'].':';
                                echo 
                        $match['seconds'];
                                echo 
                        '</br>';

                                
                        // precise 0:04:00:00
                                
                        if (($match['days']) == (0) AND ($match['hours']) == (4) AND ($match['minutes']) == (00) AND ($match['seconds']) == (00)){
                                    
                        $filters1 count($match['hours']);
                                }
                                
                        // smaller then 0:04:00:00
                                
                        elseif (($match['days']) == (0) AND ($match['hours']) < (4)){
                                    
                        $filters2 count($match['hours']);
                                }
                                
                        // greater then 4
                                
                        else {
                                    
                        $filters3 count($match['hours']);
                                }
                            }
                            echo 
                        '</div>';
                        }    

                        $result $filters1 $filters2// under + precise 4:00
                        $total count($matches); // total input count
                        echo '<div id="out">';
                        echo 
                        '<div id="rowb"><div id="left">Anzahl Eingabe:</div><div id="right"><b> '.$total.'</b></div></div></br>'// total input count
                        echo '<div id="row"><div id="left">Genau 4 h:</div><div id="right"><b> '.$filters1.'</b></div></div>'// precise 4:00 count
                        echo '<div id="row"><div id="left">Unter 4 h:</div><div id="right"><b> '.$filters2.'</b></div></div>'// under 4:00 count
                        echo '<div id="rowb"><div id="left">Gesamt unter + genau:</div><div id="right"><b> '.$result.'</b></div></div>'// under + precise 4:00 count
                        echo '<div id="row"><div id="left">Über 4 h:</div><div id="right"><b>'.count($filters3).'</b></div></div>'// over 4:00 count
                        echo '<div id="row"><div id="left">Gesamt in %:</div><div id="right"><b>'.round(($result/$total*100), 1).'%</b></div></div>'// percent calculation
                        echo '</div>';
                        }
                        ?>
                        Wenn ich folgenden Input tätige:
                        2019-11-26 12_14_38-Mozilla Firefox.png
                        erhalte ich das korrekte Ergebnis:
                        2019-11-26 12_15_05-Mozilla Firefox.png

                        Wenn ich aber einen Input zweimal eintrage stimmt der Counter nicht mehr. Dabei spielt es keine Rolle welchen der drei Arten ich Doppelt nehme:

                        2019-11-26 12_17_03-Mozilla Firefox.png
                        2019-11-26 12_17_14-Mozilla Firefox.png
                        D.h. in diesem Beispiel sollte doch "unter 4h" zwei mal vorhanden sein.
                        Wie genau kriege ich das hin ?

                        LG

                        Kommentar


                        • #13
                          weil du hier $filters2 = count($match['hours']); immer wieder $filters2 überschreibst, statt dazu zu addieren. sprich $filters2 hat immer nur den letzten Wert aus der Schleife
                          apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                          Kommentar


                          • #14
                            Siehe auch hausl Beitrag dazu in #11.

                            Kommentar


                            • #15
                              Zitat von BlackScorp Beitrag anzeigen
                              weil du hier $filters2 = count($match['hours']); immer wieder $filters2 überschreibst, statt dazu zu addieren. sprich $filters2 hat immer nur den letzten Wert aus der Schleife
                              Danke für den Hinweis, das hat das Problem gelöst.

                              Kommentar

                              Lädt...
                              X