mehrdimensionales array einlesen - aber wie?

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

  • #16
    Original geschrieben von Griecherus
    Sind die Indizies der Arrays denn numerisch? Falls ja, dann ist array_intersect nämlich durchaus das, was du suchst. Du musst nur zusätzlich überprüfen, ob die Indizes der Übereinstimmungen (im Rückgabewert enthalten) gleich 0 sind.
    Ja, sie sind nummerisch. Aber array_intersect überprüft doch nur ob ein array komplett gleich einem anderen ist. Ich will aber wissen ob die Position 1 gleich Position 1 einem anderen array ist, was dabei auf den anderen Positionen steht kann unterschiedlich sein.

    Kommentar


    • #17
      Ja, habe ich eingesehen. Eine Möglichkeit, die mir spontan eingefallen ist, ist diese:
      PHP-Code:
      function array_first_key_is_equal()
      {
          
      $arrays      func_get_args();
          
      $array_count count($arrays);

          
      $result = array();

          for (
      $i 0$i $array_count$i++)
          {
              if (
      $arrays[0][0] == $arrays[$i][0])
              {
                  
      $result[] = $arrays[$i];
              }
          }

          return 
      $result;

      Du solltest dir aber bewusst sein, dass das nur eine Hilfe ist. Eine fertige Lösung für dein Problem ist das noch nicht, da der Vergleich der Arrays ausschließlich dem ersten gegenüber geschieht.
      Zuletzt geändert von Griecherus; 25.03.2008, 23:44.
      Nieder mit der Camel Case-Konvention

      Kommentar


      • #18
        Original geschrieben von Griecherus
        Ja, habe ich eingesehen. Eine Möglichkeit, die mir spontan eingefallen ist, ist diese:
        PHP-Code:
        function array_first_key_is_equal()
        {
            
        $arrays      func_get_args();
            
        $array_count count($arrays);

            
        $result = array();

            for (
        $i 0$i $array_count$i++)
            {
                if (
        $arrays[0][0] == $arrays[$i][0])
                {
                    
        $result[] = $arrays[$i];
                }
            }

            return 
        $result;

        Du solltest dir aber bewusst sein, dass das nur eine Hilfe ist. Eine fertige Lösung für dein Problem ist das noch nicht, da der Vergleich der Arrays ausschließlich dem ersten gegenüber geschieht.
        Spontan eingefallen ... :-) NIcht schlecht. Leider klappt es nicht wie es sollte:
        PHP-Code:
        $result1 = array('a','b','c')
        $result2 = array('a','y','w');
        $result array_merge($result1$result2);

        function 
        array_first_key_is_equal()
        {
            
        $arrays      func_get_args();
            
        $array_count count($arrays);

            
        $result = array();

            for (
        $i 0$i $array_count$i++)
            {
                if (
        $arrays[0][0] == $arrays[$i][0])
                {
                    
        $result[] = $arrays[$i];
                }
            }

            return 
        $result;
        }
        array_first_key_is_equal($result);
        echo 
        '<pre>';
        print_r($result);
        echo
        '</pre>'
        Ergebniss:
        Array
        (
        [0] => a
        [1] => b
        [2] => c
        [3] => a
        [4] => y
        [5] => w
        )
        Es sollte ja nur einmal "a" auftauchen.
        Zuletzt geändert von janein; 26.03.2008, 00:03.

        Kommentar


        • #19
          Du benutzt die Funktion auch falsch. Die Arrays müssen einzeln an die Funktion übergeben werden.
          PHP-Code:
          $result array_first_key_is_equal($array1$array2, ..., $arrayn); 
          Dann ist das Ergebnis auch fast wie gewollt. Das einzige Problem allerdings ist, dass der Vergleich zwischen den Schlüsseln immer im Bezug zum ersten Array steht. Und die Funktion dahingehend zu erweitern ist deine Aufgabe

          Ich verabschiede mich für heute: Gute Nacht, Forum!
          Zuletzt geändert von Griecherus; 26.03.2008, 00:13.
          Nieder mit der Camel Case-Konvention

          Kommentar


          • #20
            Original geschrieben von janein
            Spontan eingefallen ... :-) NIcht schlecht. Leider klappt es nicht wie es sollte:
            PHP-Code:
            $result1 = array('a','b','c')
            $result2 = array('a','y','w');
            $result array_merge($result1$result2);

            function 
            array_first_key_is_equal()
            {
                
            $arrays      func_get_args();
                
            $array_count count($arrays);

                
            $result = array();

                for (
            $i 0$i $array_count$i++)
                {
                    if (
            $arrays[0][0] == $arrays[$i][0])
                    {
                        
            $result[] = $arrays[$i];
                    }
                }

                return 
            $result;
            }
            array_first_key_is_equal($result);
            echo 
            '<pre>';
            print_r($result);
            echo
            '</pre>'
            Ergebniss:
            Array
            (
            [0] => a
            [1] => b
            [2] => c
            [3] => a
            [4] => y
            [5] => w
            )
            Es sollte ja nur einmal "a" auftauchen.
            Es soll ja jedes argument mit jedem verglichen werden. Ich habe es so probiert aber es klappt nicht:
            [PHP]
            ...
            for ($e = 0; $e < $array_count; $e++)
            for ($i = 0; $i < $array_count; $i++)
            {
            if ($arrays[$e][0] == $arrays[$i][0])
            {
            $result[] = $arrays[$i];
            }
            }
            }

            return $result;
            }
            [⁄PHP]

            Kommentar


            • #21
              Original geschrieben von janein
              Es soll ja jedes argument mit jedem verglichen werden. Ich habe es so probiert aber es klappt nicht:
              [PHP]
              ...
              for ($e = 0; $e < $array_count; $e++) {
              for ($i = 0; $i < $array_count; $i++)
              {
              if ($arrays[$e][0] == $arrays[$i][0])
              {
              $result[] = $arrays[$i];
              }
              }
              }

              return $result;
              }
              [⁄PHP]

              Kommentar


              • #22
                Zwei verschachtelte Schleifen sind schonmal nicht schlecht, auf diese Weise allerdings doch sinnfrei.

                Hier mal der Pseudocode einer möglichen Herangehensweise:
                Code:
                [b]für jedes[/b] i [b]von[/b] 0 [b]bis[/b] array_länge
                
                    [b]für jedes[/b] j [b]von[/b] i + 1 [b]bis[/b] array_länge
                
                        [b]falls[/b] array[i][0] === array[j][0]
                
                            zwischenergebnis in result_array ablegen
                
                        [b]ende_falls[/b]
                
                    [b]ende_für[/b]
                
                [b]ende_für[/b]
                Das ist so noch recht simpel. Implementierst du das eins-zu-eins, dann solltest du einige Elemente doppelt im Ergebnis haben, also musst du dir da noch etwas einfallen lassen.

                Grüße
                Nieder mit der Camel Case-Konvention

                Kommentar


                • #23
                  Mit folgendem code habe ich probiert über eine Vergleichs array die Werte zu überprüfen, aber es klappt nicht. Ich bekomme es einfach nicht hin, die doppelten Werte aus einem mehrdimensionalen array zu löschen. Evt. hat ja jemand noch einen anderen Ansatz ... ich komme leider nicht weiter.

                  [code]
                  foreach (explode("\n", $lines1) as $line1)
                  {
                  $result1[] = explode('|', $line1);

                  }

                  foreach (explode("\n", $lines2) as $line2)
                  {
                  $result2[] = explode('|', $line2);
                  }

                  for ($i = 0, $laenge = count($result1); $i < $laenge;$i++ ){
                  $a[] = array( $result1[$i][0]);
                  if($a[$i][0]=="" ){
                  unset($a[$i]);
                  }
                  }

                  for ($i = 0, $laenge = count($result2); $i < $laenge;$i++ ){
                  $b[] = array( $result2[$i][0]);
                  }
                  [⁄code]

                  Kommentar


                  • #24
                    Ich habe dir doch einen Ansatz in Pseudocode vorgeschlagen. Den musst du nur noch ausarbeiten, das Hauptsächliche macht er bereits.
                    Nieder mit der Camel Case-Konvention

                    Kommentar


                    • #25
                      Original geschrieben von Griecherus
                      Ich habe dir doch einen Ansatz in Pseudocode vorgeschlagen. Den musst du nur noch ausarbeiten, das Hauptsächliche macht er bereits.
                      So?
                      [PHP]
                      for ($i = 0, $laenge = count($result1); $i < $laenge;$i++ ){
                      for ($e = 0, $laenge = count($result2); $e < $laenge;$i++ ){
                      if($result[$result1[$i]] === $result2[$e]){
                      unset($result[$i]);
                      }
                      }
                      }
                      [⁄PHP]
                      Ich schnalls nicht ... und sehe keinen Zusammenhang mehr.
                      (Und wieso kommt mein code immer so unformatiert rüber?)
                      Zuletzt geändert von janein; 26.03.2008, 22:10.

                      Kommentar


                      • #26
                        Nein, so nicht. Gehen wir das Ganze nochmal grundlegender an: Du möchtest, dass eine variable Anzahl von Arrays miteinander verglichen werden. Für diesen Vergleich ist für jedes Array jeweils nur der erste Schlüssel von Relevanz. Denn ins Ergebnis kommen nur die Arrays, die einen identischen ersten Schlüssel haben. Soweit klar?
                        Jetzt musst du also einen Algorithmus schreiben, der genau das macht. Und da gibt es sicherlich nicht nur eine einzige Möglichkeit. Ich erkläre dir meinen Ansatz mal an einem Beispiel:
                        Code:
                        array1 = array(123, abc, def);
                        array2 = array(321, ghi, jkl);
                        array3 = array(123, mno, pqr);
                        array4 = ...
                        array5 = ...
                        array6 = ...
                        
                        // ins Ergebnis gehören array1 und array2, da der erste Schlüssel `123`identisch ist
                        Jetzt schnappst du dir das erste Array (array1) und vergleichst den ersten Schlüssel (array1[0]) mit dem ersten Schlüssel des darauf folgenden array (array2[0]). Findest du eine Übereinstimmung -> speichern. Danach kommt das nächste Array (array3[0]) usw.
                        Es entsteht also folgendes Durchlaufmuster (bei bspw. 6 Arrays):

                        array1[0] mit array2[0]
                        array1[0] mit array3[0]
                        array1[0] mit array4[0]
                        array1[0] mit array5[0]
                        array1[0] mit array6[0]

                        array2[0] mit array3[0]
                        array2[0] mit array4[0]
                        array2[0] mit array5[0]
                        array2[0] mit array6[0]

                        array3[0] mit array4[0]
                        array3[0] mit array5[0]
                        array3[0] mit array6[0]

                        array4[0] mit array5[0]
                        array4[0] mit array6[0]

                        array5[0] mit array6[0]

                        fertig. Muster verstanden?
                        Das ist jetzt noch sehr "roh". Das heisst es ist noch viel, viel Platz für Optimierungen. Aber das soll jetzt erstmal reichen.
                        Nieder mit der Camel Case-Konvention

                        Kommentar


                        • #27
                          So, mit diesem code erhalte ich ein Ergebnis. Allerdings werden 3 Treffer gefunden. Das verstehe ich nicht und wie kann ich die doppelten Werte löschen? Wenn ich unset($a[$i]) auf den gefundenen Wert ansetze kommen diese nervigen "Notice: Undefined offset:" Fehler ...

                          $a[0] = array("a", "b", "c");
                          $b[0] = array("a", "a", "z");

                          $treffer = "";
                          $h =1;
                          // Werte vergleichen
                          for($i=0;$i<count($a);$i++){
                          for($j=0;$j<count($b[$i]);$j++){
                          if($a[$i][0] == $b[$i][0]){

                          // Treffer
                          $treffer[$h] = $array01[$i][0];

                          $h++;
                          }
                          }
                          }
                          Zuletzt geändert von janein; 26.03.2008, 23:09.

                          Kommentar


                          • #28
                            Das sieht doch schonmal nicht schlecht aus. Nur am zweiten count störe ich mich noch.
                            Dass du doppelte Einträge erhalten würdest, habe ich dir ja gesagt. Jetzt haben wir schon eine ganze Menge zusammen durchgekaut, überleg mal selbst. Schnapp dir von mir aus Stift und Papier. Wie könnteste du vermeiden, dass doppelte Einträge entstehen (und zwar ohne, dass du das Ergebnis-Array nochmal durchläufst und die doppelten Einträge löschst, sondern innerhalb fder beiden Schleifen, die für die Vergleiche zuständig sind)? Zwei Tipps gebe ich dir noch mit:[list=1][*]Hast du erstmal eine Übereinstimmung mehrerer Schlüssel gefunden, musst du sie bei der nächsten Iteration eigentlich nicht mehr miteinbeziehen. Das erspart außerdem Ressourcen, macht den Algorithmus also etwas effektiver.[*]unset() - wie du schon an den undefined offset Fehlern bemerkt hast - löscht das Array-Element und seinen Key gleich dazu. Also fehlt der gelöschte Key im nächsten Durchlauf. Du suchst also eine Funktion, die das Array nachdem sie es beschnitten hat, neu indiziert. Und die gibt es.[/list=1]
                            Also zurücklehnen, nachdenken, versuchen und schaffen. Sonst nehme ich noch Lehrgebühr
                            EDIT:

                            Übrigens, du musst deinen Code mit Leerzeichen einrücken, damit hier etwas aus der Formatierung wird (beim Posten also fleißig <wortschöpfung>leerzeichnen</wortschöpfung>)

                            Zuletzt geändert von Griecherus; 26.03.2008, 23:20.
                            Nieder mit der Camel Case-Konvention

                            Kommentar


                            • #29
                              Erstmal vielen herzlichen Dank für Deine Geduld und Deine Mühe!

                              Ich habe jetzt nach dieser php Funktion gesucht die einen Wert und Key löscht und das array neu indiziert - aber nicht gefunden. Wie heißt sie? :-) Und was stört Dich am count?

                              Kommentar


                              • #30
                                Original geschrieben von janein
                                Erstmal vielen herzlichen Dank für Deine Geduld und Deine Mühe!
                                Gern geschehen.
                                Original geschrieben von janein
                                Ich habe jetzt nach dieser php Funktion gesucht die einen Wert und Key löscht und das array neu indiziert - aber nicht gefunden. Wie heißt sie? :-) Und was stört Dich am count?
                                array_slice() heisst sie. In puncto count: Du möchtest die Schleife genau so oft durchlaufen, wie Arrays noch vor dir liegen. Denk nochmal drüber nach.
                                Nieder mit der Camel Case-Konvention

                                Kommentar

                                Lädt...
                                X