Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] array_unique, aber nicht alles :-)

Einklappen

Neue Werbung 2019

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

  • [Erledigt] array_unique, aber nicht alles :-)

    Hallo,

    ich habe folgendes problem.

    Ich muss diverse Zeitreihen graderücken, aber manche Datum- und Zeitangaben sind doppelt. leider....

    zb: ein von mir erstelleter beispiel text
    Code:
    1    2    a
    2    2    b
    3    2    c
    4    2    d
    4    2    e
    5    2    f
    6    2    g
    7    2    h
    7    2    i
    8    2    j
    9    2    k
    10    2    l




    PHP-Code:
    $alt=fopen("zahl.txt","r");
    $neu=fopen("zahl_comp.txt","w");
    $i=0;
        while(!
    feof($alt))
        {
        
    $zeile=fgets($alt);
        
    $teile=explode("    ",$zeile);
        
    $known[]=$teile[0]."    ".$teile[1];
        
    $i++;
        
        }

    $result=array_unique($known);
    echo 
    "$i<br>";
    fclose($alt);

    $alt=fopen("zahl.txt","r");
        while(!
    feof($alt))
        {
        
    $zeile=fgets($alt);
        
    $teile=explode("    ",$zeile);
        
    $vergleich=$teile[0]."    ".$teile[1];
            for(
    $j=0;$j<$i;$j++)
            {
                if(
    $vergleich == $result[$j])
                {
                echo 
    "$vergleich und resultat : $result[$j]<br>";
                
    fwrite($neu,$zeile);
                break;
                }
            }
        }


    print_r($result); 
    mein ansatz war die Zeile zu "exploden" und die zwei spalten ( $known) mit den ersten zwei spalten des textes abzugleichen.

    die ausgabe von array_unique ist ja richtig
    Code:
    Array ( [0] => 1 [1] => 2 2 [2] => 3 2 [3] => 4 2 [5] => 5 2 [6] => 6 2 [7] => 7 2 [9] => 8 2 [10] => 9 2 [11] => 10 2 [12] => )
    doch wie sag ich php, dass er nur die arrays benutzen soll, die in unique drin sind.

    in der for- schleife klappert php alles wetrte ab, auch die die nich unique sind...

    hmmm....

  • #2
    $i dürfte in der for-Schleife zu groß sein. Ansonsten verstehe ich nicht, was du eigentlich vorhast.

    http://de.php.net/manual/de/function...-reporting.php
    [URL]http://hallophp.de[/URL]

    Kommentar


    • #3
      eigentlich möchte ich nur die ersten zwei spalten vergleichen und die doppelten sollten "gelöscht" werden.
      Code:
      20.03.2009    07:50    12.1    56
      20.03.2009    09:00    11.5    55
      20.03.2009    09:10    10.5    52
      20.03.2009    09:20    11    55
      20.03.2009    09:30    11.8    51
      20.03.2009    09:40    12.3    49
      20.03.2009    09:50    11.2    52
      20.03.2009    09:00    11.3    55
      20.03.2009    09:10    11.3    53
      20.03.2009    09:20    10    49
      20.03.2009    09:30    11.3    42
      20.03.2009    09:40    12.1    39
      20.03.2009    09:50    11.5    41
      20.03.2009    10:00    12.2    45
      20.03.2009    10:10    12.6    43
      hier ist so ein textfile.
      neun uhr kommt zweimal vor und ich möchte diese datei neu schreiben, aber mit neun uhr nur einmal drin, damit ich ne schöne zeitreihe habe...

      evtl geht das ja viel leichter, aber ich bin nun mal ein anfänger....

      Kommentar


      • #4
        Verfallen die anderen Daten unter doppelten Uhrzeiten dann ebenfalls oder sollen diese nur unter einer gemeinsamen Uhrzeit gruppiert werden?

        Ich könnte mir auch ein mehrdimensionales Array vorstellen. Mit dem Datum als Index in der ersten Ebene und der Uhrzeit als Index in der Zweiten. So überschreibst du dann einen vorhandenen Index, wenn ein Eintrag mit gleichem Datum und gleicher Uhrzeit gefunden wird.
        [URL]http://hallophp.de[/URL]

        Kommentar


        • #5
          in der zeile sollten datum und uhrzeit abgeglichen werden.

          mein lösungsansatz wär ja schon richtig.....(aber unschön, aber egal)

          array_unique gibt ja array[4] nicht aus. im array ist die 4 aber vorhanden.

          daher funktioniert das mit meine for-schleife auch nicht.

          wie kann ich das also umgehen?

          diese ausgabe wäre dann richtig.
          Code:
          20.03.2009    07:40    11.7    51
          20.03.2009    07:50    12.1    56
          20.03.2009    09:00    11.5    55
          20.03.2009    09:10    10.5    52
          20.03.2009    09:20    11    55
          20.03.2009    09:30    11.8    51
          20.03.2009    09:40    12.3    49
          20.03.2009    09:50    11.2    52
          20.03.2009    10:00    12.2    45
          20.03.2009    10:10    12.6    43

          Kommentar


          • #6
            Auch wenn du nicht mit Datum und Uhrzeit als Indizes arbeiten willst, erstmal ein mehrdimensionales Array zu basteln (mit explode() und file() bzw fgets()) ist auf jeden Fall empfehlenswert. Um dann z.b. von
            PHP-Code:
            array(
                array(
            'datum'=>1'uhrzeit'=>2'foo' => 'a'),
                array(
            'datum'=>2'uhrzeit'=>2'foo' => 'b'),
                array(
            'datum'=>3'uhrzeit'=>2'foo' => 'c'),
                array(
            'datum'=>4'uhrzeit'=>2'foo' => 'd'),
                array(
            'datum'=>4'uhrzeit'=>2'foo' => 'e'),
                array(
            'datum'=>5'uhrzeit'=>2'foo' => 'f')
            ); 
            zu

            PHP-Code:
            array(
                array(
            'datum'=>1'uhrzeit'=>2'foo' => 'a'),
                array(
            'datum'=>2'uhrzeit'=>2'foo' => 'b'),
                array(
            'datum'=>3'uhrzeit'=>2'foo' => 'c'),
                array(
            'datum'=>4'uhrzeit'=>2'foo' => 'd'),
                array(
            'datum'=>5'uhrzeit'=>2'foo' => 'f')
            ); 
            zu kommen ($data ist das Array):

            PHP-Code:
            // Sortiere nach Datum und Uhrzeit (siehe Beispiel in Manual zu array_multisort):
            $_datum $_uhrzeit = array();
            foreach (
            $data as $key => $row) {
                
            $_datum[$key]    = $row['datum'];
                
            $_uhrzeit[$key] = $row['uhrzeit'];
            }
            array_multisort($_datumSORT_ASC$_uhrzeitSORT_ASC$data);

            // lösche doppelte
            $_last = array('datum'=>null,'uhrzeit'=>null);
            foreach(
            $data as $key => $row) {
                if (
            $_last['datum'] == $row['datum'] && $_last['uhrzeit'] == $row['uhrzeit'])
                    unset(
            $data[$key]);
                
            $_last $row;

            [IMG]https://g.twimg.com/twitter-bird-16x16.png[/IMG][URL="https://twitter.com/fschmengler"]@fschmengler[/URL] - [IMG]https://i.stack.imgur.com/qh235.png[/IMG][URL="https://stackoverflow.com/users/664108/fschmengler"]@fschmengler[/URL] - [IMG]http://i.imgur.com/ZEqflLv.png[/IMG] [URL="https://github.com/schmengler/"]@schmengler[/URL]
            [URL="http://www.schmengler-se.de/"]PHP Blog[/URL] - [URL="http://www.schmengler-se.de/magento-entwicklung/"]Magento Entwicklung[/URL] - [URL="http://www.css3d.net/"]CSS Ribbon Generator[/URL]

            Kommentar


            • #7
              ok ich werd das mal so machen. ich poste es dann.

              nur geht mir nicht in den kopf das ding mit array_unique.

              wie kann ich nur die werte ansprechen, die in array uniqe ausgegeben werde?

              Kommentar


              • #8
                Schau dir doch einfach mal an, was im Array steht. Ansprechen kannst du die Werte wie bei jedem anderen Array auch.
                [URL]http://hallophp.de[/URL]

                Kommentar


                • #9
                  Wenn du bei diesem Ansatz bleiben willst, musst du dir wohl mit array_keys(array_unique($known)) die Schlüssel der übriggebliebenen Elemente holen und dann mit [man]array_intersect_key[/man] die Schnittmenge zu den ursprünglichen Daten bilden (die aus der Datei ausgelesenen Zeilen).
                  [IMG]https://g.twimg.com/twitter-bird-16x16.png[/IMG][URL="https://twitter.com/fschmengler"]@fschmengler[/URL] - [IMG]https://i.stack.imgur.com/qh235.png[/IMG][URL="https://stackoverflow.com/users/664108/fschmengler"]@fschmengler[/URL] - [IMG]http://i.imgur.com/ZEqflLv.png[/IMG] [URL="https://github.com/schmengler/"]@schmengler[/URL]
                  [URL="http://www.schmengler-se.de/"]PHP Blog[/URL] - [URL="http://www.schmengler-se.de/magento-entwicklung/"]Magento Entwicklung[/URL] - [URL="http://www.css3d.net/"]CSS Ribbon Generator[/URL]

                  Kommentar


                  • #10
                    ich bastel schon am multisort...

                    mein ansatz war zwar umständlich, trotzdem kapier ichs ned.

                    Code:
                    Array ( [0] => 1 [1] => 2 2 [2] => 3 2 [3] => 4 2 [5] => 5 2 [6] => 6 2 [7] => 7 2 [9] => 8 2 [10] => 9 2 [11] => 10 2 [12] => )
                    ausgegeben werde ja nicht [4] und [8].

                    irgendwie müsste man doch das obige array in eine fortlaufende zahlenfolge ändern können.... also

                    1 2 3 5 6 7 9 10

                    in
                    1 2 3 4 5 6 7 8

                    ??

                    Kommentar


                    • #11
                      ich weiß zwar nicht warum du das brauchst aber:
                      PHP-Code:
                      range(1,count($array)); 
                      [IMG]https://g.twimg.com/twitter-bird-16x16.png[/IMG][URL="https://twitter.com/fschmengler"]@fschmengler[/URL] - [IMG]https://i.stack.imgur.com/qh235.png[/IMG][URL="https://stackoverflow.com/users/664108/fschmengler"]@fschmengler[/URL] - [IMG]http://i.imgur.com/ZEqflLv.png[/IMG] [URL="https://github.com/schmengler/"]@schmengler[/URL]
                      [URL="http://www.schmengler-se.de/"]PHP Blog[/URL] - [URL="http://www.schmengler-se.de/magento-entwicklung/"]Magento Entwicklung[/URL] - [URL="http://www.css3d.net/"]CSS Ribbon Generator[/URL]

                      Kommentar


                      • #12
                        PHP-Code:
                        //error_reporting(E_ALL);
                        $alt=fopen("zahl.txt","r");
                        $neu=fopen("zahl_comp.txt","w");

                            while(!
                        feof($alt))
                            {
                            
                        $zeile=fgets($alt);
                            
                        $teile=explode("    ",$zeile);
                            
                        $data[]=array('datum'=>$teile[0], 'uhrzeit'=>$teile[1], 'werte' => $teile[2].$teile[3]);
                            
                            
                            }
                             
                        print_r($array);

                        $_datum $_uhrzeit = array();
                        foreach (
                        $data as $key => $row) {
                            
                        $_datum[$key]    = $row['datum'];
                            
                        $_uhrzeit[$key] = $row['uhrzeit'];
                        }
                        array_multisort($_datumSORT_ASC$_uhrzeitSORT_ASC$data);

                        // lösche doppelte
                        $_last = array('datum'=>null,'uhrzeit'=>null);
                        foreach(
                        $data as $key => $row) {
                            if (
                        $_last['datum'] == $row['datum'] && $_last['uhrzeit'] == $row['uhrzeit'])
                                unset(
                        $data[$key]);
                            
                        $_last $row;
                        }
                        print_r($data); 
                        ok, super. funzt soweit!!

                        nur noch ein klenes problemchen....hab mich heut das erste mal mit foreach schleifen vertraut gemacht

                        wie kann ich denn die werte jetzt in eine datei schreiben?

                        diese meldung kommt: fwrite() expects parameter 2 to be string, array given in C:\xampp\htdocs\eoljorat\test\zahl.php on line 34 , wenn ichs so schreibe
                        PHP-Code:
                        foreach($data as $reihe)
                        {
                        fwrite($neu,$data);

                        Kommentar


                        • #13
                          Das hat nichts mit der Schleife zu tun, dir fehlt für das ursprüngliche Format das Gegenstück zu folgender Zeile:
                          PHP-Code:
                              $teile=explode("    ",$zeile); 
                          Sieh dazu mal hier: [man]join[/man]
                          [IMG]https://g.twimg.com/twitter-bird-16x16.png[/IMG][URL="https://twitter.com/fschmengler"]@fschmengler[/URL] - [IMG]https://i.stack.imgur.com/qh235.png[/IMG][URL="https://stackoverflow.com/users/664108/fschmengler"]@fschmengler[/URL] - [IMG]http://i.imgur.com/ZEqflLv.png[/IMG] [URL="https://github.com/schmengler/"]@schmengler[/URL]
                          [URL="http://www.schmengler-se.de/"]PHP Blog[/URL] - [URL="http://www.schmengler-se.de/magento-entwicklung/"]Magento Entwicklung[/URL] - [URL="http://www.css3d.net/"]CSS Ribbon Generator[/URL]

                          Kommentar


                          • #14
                            mmmh...

                            PHP-Code:
                            foreach($data as $reihe)
                            {
                            $n_zeile=implode("    ",$reihe);

                            fwrite($neu,$n_zeile);

                            letzte blöde frage: wie kann ich einzelne arrays, speziell jetzt hier ansteuern....? mit data[0][0] gehts nicht...(gibts auch ein smiley für schämen)

                            Kommentar


                            • #15
                              Suchst du $data[0]['datum'] ? Dann ist schämen wirklich angebracht
                              [IMG]https://g.twimg.com/twitter-bird-16x16.png[/IMG][URL="https://twitter.com/fschmengler"]@fschmengler[/URL] - [IMG]https://i.stack.imgur.com/qh235.png[/IMG][URL="https://stackoverflow.com/users/664108/fschmengler"]@fschmengler[/URL] - [IMG]http://i.imgur.com/ZEqflLv.png[/IMG] [URL="https://github.com/schmengler/"]@schmengler[/URL]
                              [URL="http://www.schmengler-se.de/"]PHP Blog[/URL] - [URL="http://www.schmengler-se.de/magento-entwicklung/"]Magento Entwicklung[/URL] - [URL="http://www.css3d.net/"]CSS Ribbon Generator[/URL]

                              Kommentar

                              Lädt...
                              X