Martin Rozmus: funktion count und mehrdimensionale Arrays

Abend zur später Stunde,

Mein Anliegen: Ich habe ein drei dimensionales Array. Vorab versuche ich es in einer Grafik darzustellen und hinterher werde ich ein paar Worte dazu verlieren:

|-Arr[0][0]
                  |-Arr[0][1]
         |-Arr[0]-|-Arr[0][2]
         |        |-Arr[0][3]
    Arr--|        |-Arr[0][4]
         |
         |
         |        |-Arr[1][0]
         |-Arr[1]-|
                  |-Arr[1][1]

So, nun versuche ich das in Worte zu fassen. Wer mein Diagramm verstanden hat, kann den Absatz überspringen: In der ersten Dimension des Arrays sind zwei zweisimensionale Arrays gespeichert. In dem ersten zweidimensionalen Array[0] sind fünf und in dem zweiten Array[1] zwei eindimensionale Arrays gespeichert (Arr[x][y]).

--->PROBLEM: wenn ich die Anzahl der Elemente in Arr[0] mit der funktion count(Arr[0]) aufrufe, liefert sie mir hier den richtigen Wert von 5.
Dagegen liefert count(Arr[1]) den Wert 7, ergo die Summe aus count(Arr[0]) und count(Arr[1]).

Müsste aber das Ergebnis für count(Arr[1]) nicht 2 Lauten? In Arr[1] sind schließlich nur zwei Weitere Elemente vorhanden.
Hat jemand einen Ansatz dafür, wie ich die Anzahl der Elemente in Arr[1] nicht als Summe aus Arr[x] erhalte?

Für die Denkansträngung um diese Uhrzeit entschuldige ich mich jetzt schon und hoffe auf Anregungen.

Gruss Martin

  1. hallo Martin,

    Mein Anliegen: Ich habe ein drei dimensionales Array. Vorab versuche ich es in einer Grafik darzustellen

    Das hilft nicht viel. Du weißt, daß du es hier vor allem mit Leuten zu tun hast, die auch teilweise sehr komplexe Codezeilen lesen können und/oder täglich erstellen. Wenn du grafische Darstellungen zur Verdeutlichung eines Problems hier demonstieren willst, sollte das in Form eines Screenshots geschehen  -  naja, geht wohl im Moment bei dir noch nicht.

    In der ersten Dimension des Arrays sind zwei zweisimensionale Arrays gespeichert. In dem ersten zweidimensionalen Array[0] sind fünf und in dem zweiten Array[1] zwei eindimensionale Arrays gespeichert (Arr[x][y]).

    Ja, sowas gibts, das kann man machen ... aber wo ist dein Code dazu, um nachzuschauen, ob dein Code auch exakt dasselbe macht wie deine verbale Beschreibung?

    --->PROBLEM: wenn ich die Anzahl der Elemente in Arr[0] mit der funktion count(Arr[0]) aufrufe, liefert sie mir hier den richtigen Wert von 5.

    Nett.

    Dagegen liefert count(Arr[1]) den Wert 7, ergo die Summe aus count(Arr[0]) und count(Arr[1]).

    Weniger nett. Aber ohne Kenntnis des zugrundegelegten Codes nicht verifizierbar.

    Für die Denkansträngung um diese Uhrzeit entschuldige ich mich jetzt schon und hoffe auf Anregungen.

    Naja, so sehr "sträng" wars ja noch nicht. Das wirds erst, wenn man sich tatsächlich anhand deines Scripts anschauen kann, wo eventuell der Fehler liegt.

    Grüße aus Berlin

    Christoph S.

    1. Hallo Christoph,

      hier ist ein Ausschnitt aus dem Code:

      $arr=person_suchen($_REQUEST['suchwert']);
      .....

      <ul>
      <?
         $arr_suchwert=split('[#]',$_REQUEST['suchwert']);
         $i=0;
         for ($n=0;$n<count($arr);$n++){
      ?>
      <p>Die Suche nach <b><? echo $arr_suchwert[$n]  ?></b> ergab <b><? echo count($arr[$n]) ?></b> Suchergebnisse
                                                                          ^^^^^^^^^^^^^^ hier steckt der Teufel
      für das Formular <b><? echo $zeile[0] ?></b></p>
      <?
               for($i;$i<count($arr[$n]);$i++){
      ?>
               <li>
                   <a href="../haupt/eingabe.php?incl=<? echo urlencode($_REQUEST['ziel']) ?>&lfd=<? echo $arr[$n][$i][0] ?>">
                    <? echo $arr[$n][$i][0].", ".$arr[$n][$i][1].", ".$arr[$n][$i][2].
                    ", ".datum_us2eu($arr[$n][$i][3]).", ".$arr[$n][$i][4] ?>
                   </a>
               </li>
      <?

      }
         }
      ?>
        </ul>

      Etwas zu Hintergrund: In ein einzeiliges Textfeld kann man Name [Vorname][Geburtsdatum] mehrerer Personen eingeben, um nach ihnen in einer DB zu suchen. Die Personen werden mit # getrennt, die Werte in [] sind optional.
      Die Funktion hierfür:

      function person_suchen($such_arr){
        $big_arr = split('[#]',$such_arr);
         $i=0;
         for($n=0;$n<count($big_arr);$n++){
                $arr = split('[,. ;]',$big_arr[$n],3);
               if (count($arr)==1){
                  $sql=
                  "SELECT...WHERE... AND personen.nachname LIKE '".$arr[0]'
                  ";
               }
               elseif(count($arr)==2){
                  $sql=
                  "SELECT...Where...AND personen.nachname LIKE '".$arr[0]' AND personen.vorname LIKE '".$arr[1]."'
                  ";
               }
               elseif(count($arr)==3){
                  $sql=
                  "SELECT ...
                  WHERE ...
                  AND personen.nachname LIKE '".$arr[0]."'
                  AND personen.vorname LIKE '".$arr[1]."'
                  AND personen.geburtstag LIKE '".datum_eu2us($arr[2])."'
                  ";
               }
               if (isset($sql)){
                  $db = mySQL_ini();
                  $result = mysql_query($sql,$db);

      While ($zeile= mysql_fetch_row($result)){
                        $erg_arr[$i]=$zeile;
                        $i++;
                  }
               }
           $big_erg_arr[$n]=$erg_arr;
         }
          if(count($big_erg_arr)==0){
             return false;
          }
          else
          {
             return $big_erg_arr;
          }
       }

      Vielen Dank schon,

      Gruss aus Göttingen
      Martin

      1. auweia ...

        jetzt hab ich die Initiativstrafe an der Backe und darf als erster mal so tun, als ob ich was Gescheites als Lösung wüßte ...

        hier ist ein Ausschnitt aus dem Code:

        Ja, danke, wollte ich ja richtigerweise so haben. :-(

        <p>Die Suche nach <b><? echo $arr_suchwert[$n]  ?></b> ergab <b><? echo count($arr[$n]) ?></b> Suchergebnisse
                                                                            ^^^^^^^^^^^^^^ hier steckt der Teufel

        zur Teufelsaustreibung würde ich empfehlen, die Variable n zu deklarieren  -  jaja, ich weiß, daß PHP das nicht zwingend braucht. Aber probieren kann mans ja mal, wenns klappt, isses gut, wenns nicht klappt  -  naja, dann gibts halt noch das SELFHTML-Forum.

        für das Formular <b><? echo $zeile[0] ?></b></p>
        <?
                 for($i;$i<count($arr[$n]);$i++){
        ?>

        _Das_ sieht irgendwie nicht so gut aus, wenn du dir mal die Form deiner Klammern anschaust. Hier ist _innerhalb_ von <? ... ?> eine geschweifte Klammer geöffnet, aber nicht wieder geschlossen und übrigens auch eine spitze Klammer nicht ...

        Grüße aus Berlin

        Christoph S.

        1. <p>Die Suche nach <b><? echo $arr_suchwert[$n]  ?></b> ergab <b><? echo count($arr[$n]) ?></b> Suchergebnisse
                                                                              ^^^^^^^^^^^^^^ hier steckt der Teufel
          zur Teufelsaustreibung würde ich empfehlen, die Variable n zu deklarieren  -  jaja, ich weiß, daß PHP das nicht zwingend braucht. Aber probieren kann mans ja mal, wenns klappt, isses gut, wenns nicht klappt  -  naja, dann gibts halt noch das SELFHTML-Forum.

          Ist die Variable nicht schon mit:
           for ($n=0;$n<count($arr);$n++)
                 ^^^ deklariert?

          Ich habe eben versucht, sie oben zu deklarieren, also::
          $n=0;
          ...
          for($n;$n<count($arr);$n++)

          hat nichts gebracht.

          für das Formular <b><? echo $zeile[0] ?></b></p>
          <?
                   for($i;$i<count($arr[$n]);$i++){
          ?>
          _Das_ sieht irgendwie nicht so gut aus, wenn du dir mal die Form deiner Klammern anschaust. Hier ist _innerhalb_ von <? ... ?> eine geschweifte Klammer geöffnet, aber nicht wieder geschlossen und übrigens auch eine spitze Klammer nicht ...

          Die Klammern stimmen schon. Ich habe es aus dem Editor rauskopiert, anscheinend für den Fall nicht komplett. Es ergeben sich keine Fehelermeldungen seitens php. Die Suchergebnisse werden auch richtig dargestellt. Nur die Zählung der Arrays im Array ist nicht so, wie ich mir das logisch vorstellen würde.

          Übrigens, zu deinem Beitrag [pref:t=50853&m=278843] habe ich ein passendes Zitat gefunden: "Es ist nett, wichtig zu sein, aber ist wichtiger, nett zu sein." ;-)

          Gruss Martin

      2. Hallo Martin,

        mach mal bitte der reinen Fehlersuche ein var_dump( $arr ), ob denn wirklich drin steht, was du vermutest.

        --
        Sic Luceat Lux!
        1. Hallo Thoralf,

          mach mal bitte der reinen Fehlersuche ein var_dump( $arr ), ob denn wirklich drin steht, was du vermutest.

          Ich glaube das ist es. Habe gerade nach zwei Personen gesucht. Die Suche sollte zwei Suchergebnisse liefern. Das Array beinhaltet aber drei Ergebnisse, davon zwei identische. Hier das Ergebnis von dump_var($arr); Beachte, Mustermann ist nur einmal in der DB vorhanden.

          array(2) {
                 [0]=> array(1) {
                                 [0]=> array(6) {
                                                 [0]=> string(2) "16"
                                                 [1]=> string(10) "Mustermann"
                                                 [2]=> string(5) "Peter"
                                                 [3]=> string(10) "1980-01-01"
                                                 [4]=> string(4) "Gast" [5]=> string(6) "gono16"
                                                 }
                                 }
                                 [1]=> array(2) {
                                                 [0]=> array(6) {
                                                                 [0]=> string(2) "16"
                                                                 [1]=> string(10) "Mustermann"
                                                                 [2]=> string(5) "Peter"
                                                                 [3]=> string(10) "1980-01-01"
                                                                 [4]=> string(4) "Gast"
                                                                 [5]=> string(6) "gono16"
                                                                 }
                                                                 [1]=> array(6) {
                                                                                [0]=> string(2) "15"
                                                                                [1]=> string(8) "Testmann"
                                                                                [2]=> string(4) "Test"
                                                                                [3]=> string(10) "0000-00-00"
                                                                                [4]=> string(4) "Gast"
                                                                                [5]=> string(6) "gono15"
                                                                                }
                                                                 }
                                                 }

          Nun muss ich herausfinden, ob die Funktion person_suchen() oder die Schleife(n), die die Ergebnisse der Funktion verarbeiten fehlerhaft sind :-|

          Danke für den Tipp,

          Gruss Martin

          1. Hallo,

            teil uns doch mal Dein SELECT-Statement mit.

            Vielleicht hilft ein DISTINCT ?

            Grüße

            Chris (C)

            1. Hallo Chris,

              teil uns doch mal Dein SELECT-Statement mit.

              daran liegt es nicht. Es ist jeweils nur ein "Testmann" und ein "Mustermann" in der DB vorhanden. Aber, hier die SQL Queries:

              if (count($arr)==1){
                          $sql=
                          "SELECT personen.lfd, personen.nachname,personen.vorname,
                          personen.geburtstag, personengruppe.gruppe, personen.kennung
                          FROM personen,personengruppe,chron_personengruppe
                          WHERE personen.nachname LIKE '".$arr[0]."'
                          AND (chron_personengruppe.fk_personen=personen.lfd
                          AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
                          AND ISNULL(chron_personengruppe.bis))
                          ";

              }
                       elseif(count($arr)==2){
                          $sql=
                          "SELECT personen.lfd, personen.nachname,personen.vorname,
                          personen.geburtstag, personengruppe.gruppe, personen.kennung
                          FROM personen,personengruppe,chron_personengruppe
                          WHERE chron_personengruppe.fk_personen=personen.lfd
                          AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
                          AND ISNULL(chron_personengruppe.bis)
                          AND personen.nachname LIKE '".$arr[0]."'
                          AND personen.vorname LIKE '".$arr[1]."'
                          ";
                       }
                       elseif(count($arr)==3){
                          $sql=
                          "SELECT personen.lfd, personen.nachname,personen.vorname,
                          personen.geburtstag, personengruppe.gruppe, personen.kennung
                          FROM personen,personengruppe,chron_personengruppe
                          WHERE chron_personengruppe.fk_personen=personen.lfd
                          AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
                          AND ISNULL(chron_personengruppe.bis)
                          AND personen.nachname LIKE '".$arr[0]."'
                          AND personen.vorname LIKE '".$arr[1]."'
                          AND personen.geburtstag LIKE '".datum_eu2us($arr[2])."'
                          ";
                       }

              Gruss Martin

              1. Hallo alle Interessierten,

                ich habe den Fehler Gefunden! Es fehlte ein einfaches unset!!! Kucken:

                function person_suchen($such_arr){
                  $big_arr = split('[#]',$such_arr);
                   for($n=0;$n<count($big_arr);$n++){
                          $arr = split('[,. ;]',$big_arr[$n],3);
                         if (count($arr)==1){
                            $sql=
                            "SELECT personen.lfd, personen.nachname,personen.vorname,
                            personen.geburtstag, personengruppe.gruppe, personen.kennung
                            FROM personen,personengruppe,chron_personengruppe
                            WHERE personen.nachname LIKE '".$arr[0]."'
                            AND (chron_personengruppe.fk_personen=personen.lfd
                            AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
                            AND ISNULL(chron_personengruppe.bis))
                            ";

                }
                         elseif(count($arr)==2){
                            $sql=
                            "SELECT personen.lfd, personen.nachname,personen.vorname,
                            personen.geburtstag, personengruppe.gruppe, personen.kennung
                            FROM personen,personengruppe,chron_personengruppe
                            WHERE chron_personengruppe.fk_personen=personen.lfd
                            AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
                            AND ISNULL(chron_personengruppe.bis)
                            AND personen.nachname LIKE '".$arr[0]."'
                            AND personen.vorname LIKE '".$arr[1]."'
                            ";
                         }
                         elseif(count($arr)==3){
                            $sql=
                            "SELECT personen.lfd, personen.nachname,personen.vorname,
                            personen.geburtstag, personengruppe.gruppe, personen.kennung
                            FROM personen,personengruppe,chron_personengruppe
                            WHERE chron_personengruppe.fk_personen=personen.lfd
                            AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
                            AND ISNULL(chron_personengruppe.bis)
                            AND personen.nachname LIKE '".$arr[0]."'
                            AND personen.vorname LIKE '".$arr[1]."'
                            AND personen.geburtstag LIKE '".datum_eu2us($arr[2])."'
                            ";
                         }
                         if (isset($sql)){
                            $db = mySQL_ini();
                            $result = mysql_query($sql,$db);
                            $i=0;
                            While ($zeile= mysql_fetch_row($result)){
                                  $erg_arr[$i]=$zeile;
                                  $i++;
                            }
                            $big_erg_arr[$n]=$erg_arr;
                            unset($erg_arr);
                            ^^^^^^^^^^^^^^^^
                ::::::::::::::::::::::::::::::::::::::::::::::::::::::
                WENN DIE SUCHE NACH DEM ERSTEN NAMEN Z.B. 3 ERGEBNISSE LIEFERTE UND DIE SUCHE NACH DEM ZWEITEN NUR 1 ERGEBNIS; SO WAR DAS (DER?) $erg_arr ARRAY BEIM DURCHGANG DER ZWEITEN SCHLEIFE IN DEN FELDERN [1][2] MIT DEN WERTEN AUS DEM ERSTEN DURCHGANG DER SCHLEIFE BESETZT. LEDIGLICH WURDE DAS FELD [0] MIT DEM NEUEN SUCHERGEBNIS ÜBERSCHRIEBEN
                :::::::::::::::::::::::::::::::::::::::::::::::::::::
                         }

                }
                    if(count($big_erg_arr)==0){
                       return false;
                    }
                    else
                    {
                       return $big_erg_arr;
                    }
                 }

                Manchmal ist die Lösung so einfach. Danke für eure Hilfe. Vor allem der Tip mit var_dump() hat mich weiter gebracht.

                Schönes Wochenende

                Gruss Martin

          2. Nun muss ich herausfinden, ob die Funktion person_suchen() oder die Schleife(n), die die Ergebnisse der Funktion verarbeiten fehlerhaft sind :-|

            Ich bin ein Stück weiter: Es liegt an der Funktion person_suchen().

            Ich habe den Code etwas modifiziert, um die Ausgaben zu verfolgen:

            function person_suchen($such_arr){
              $big_arr = split('[#]',$such_arr);
              $x=0;
              echo "BIGARR : ".count($big_arr)."\n\r________________________________________\n\r\n";
               for($n=0;$n<count($big_arr);$n++){
                      $arr = split('[,. ;]',$big_arr[$n],3);
                         //echo $arr[0]."Arr0 Scleif: ".$n."";
                     if (count($arr)==1){
                        $sql=
                        "SELECT personen.lfd, personen.nachname,personen.vorname,
                        personen.geburtstag, personengruppe.gruppe, personen.kennung
                        FROM personen,personengruppe,chron_personengruppe
                        WHERE personen.nachname LIKE '".$arr[0]."'
                        AND (chron_personengruppe.fk_personen=personen.lfd
                        AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
                        AND ISNULL(chron_personengruppe.bis))
                        ";

            }
                     elseif(count($arr)==2){
                        $sql=
                        "SELECT personen.lfd, personen.nachname,personen.vorname,
                        personen.geburtstag, personengruppe.gruppe, personen.kennung
                        FROM personen,personengruppe,chron_personengruppe
                        WHERE chron_personengruppe.fk_personen=personen.lfd
                        AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
                        AND ISNULL(chron_personengruppe.bis)
                        AND personen.nachname LIKE '".$arr[0]."'
                        AND personen.vorname LIKE '".$arr[1]."'
                        ";
                     }
                     elseif(count($arr)==3){
                        $sql=
                        "SELECT personen.lfd, personen.nachname,personen.vorname,
                        personen.geburtstag, personengruppe.gruppe, personen.kennung
                        FROM personen,personengruppe,chron_personengruppe
                        WHERE chron_personengruppe.fk_personen=personen.lfd
                        AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
                        AND ISNULL(chron_personengruppe.bis)
                        AND personen.nachname LIKE '".$arr[0]."'
                        AND personen.vorname LIKE '".$arr[1]."'
                        AND personen.geburtstag LIKE '".datum_eu2us($arr[2])."'
                        ";
                     }
                     if (isset($sql)){
                        $db = mySQL_ini();
                        $result = mysql_query($sql,$db);
                        $i=0;
                        While ($zeile= mysql_fetch_row($result)){
                        echo "Ergebnisse bei durchgagn ".$n."Schleife ".$i."  ".$zeile[5]."\n\r".
                              $erg_arr[$i]=$zeile;
                              $i++;
                              $x++;
                        }
                        $big_erg_arr[$n]=$erg_arr;
                        echo "Zeilen bei durchgagn ".$n." :".count($erg_arr)."\n\r".
                        " zu suchen: ".$arr[0]."\n\r".
                        "SQL: ".$sql."\n\r -->BIGarr .".$n."& ".$i.": ".$big_erg_arr[$n][$i][5]."\n\r------------\n\r";

            }

            }
               echo "while: ".$x."\n\n\n\r";
                if(count($big_erg_arr)==0){
                   return false;
                }
                else
                {
                   //echo $big_erg_arr[1][0][2];
                   return $big_erg_arr;
                }
             }
              person_suchen("ro%#testmann");

            Die Ausgabe sieht folgender Maßen aus:

            BIGARR : 2

            ________________________________________

            Ergebnisse bei durchgagn 0Schleife 0  gono2

            ArrayErgebnisse bei durchgagn 0Schleife 1  gono8

            ArrayErgebnisse bei durchgagn 0Schleife 2  gono9

            ArrayErgebnisse bei durchgagn 0Schleife 3  gono11

            ArrayErgebnisse bei durchgagn 0Schleife 4  gono12

            ArrayErgebnisse bei durchgagn 0Schleife 5  gono13

            ArrayErgebnisse bei durchgagn 0Schleife 6  gono14

            ArrayZeilen bei durchgagn 0 :7

            zu suchen: ro%

            SQL: SELECT personen.lfd, personen.nachname,personen.vorname,
                        personen.geburtstag, personengruppe.gruppe, personen.kennung
                        FROM personen,personengruppe,chron_personengruppe
                        WHERE personen.nachname LIKE 'ro%'
                        AND (chron_personengruppe.fk_personen=personen.lfd
                        AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
                        AND ISNULL(chron_personengruppe.bis))

            -->BIGarr .0& 7:

            ------------

            MERKWÜRDIG IST; DASS BEI DER SCHLEIFE n=1 NUR EIN ERGEBNIS ZURÜCKGEGEBEN WIRD, DIE WHILE SCHLEIFE ABER DENNOCH 7 MAL DURCHLAUFEN WIRD. WEITERHIN IST AUFFÄLLIG, DASS DIE ANZAHL DER WHILE DURCHLÄUFE BEIM DURCHGANG n=1 IDENTISCH IST MIT DER ANZAHL DER DURCHLÄUFE BEIM DURCHGANG n=0. PERSONEN MIT DEM ANFANG DES NACHNAMENS ro% SIND AUCH TATSÄCHLICH 7 MAL IN DER DB VORHANDEN. PERSONEN MIT NACHNAME testmann SIND ABER NUR 1 MAL IN DER DB VORHANDEN.
            ::::::::::::::::::::::::::::::::::::::::
            Ergebnisse bei durchgagn 1Schleife 0  gono15

            ArrayZeilen bei durchgagn 1 :7

            zu suchen: testmann
            ::::::::::::::::::::::::::::::::::::::::::::
            SQL: SELECT personen.lfd, personen.nachname,personen.vorname,
                        personen.geburtstag, personengruppe.gruppe, personen.kennung
                        FROM personen,personengruppe,chron_personengruppe
                        WHERE personen.nachname LIKE 'testmann'
                        AND (chron_personengruppe.fk_personen=personen.lfd
                        AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
                        AND ISNULL(chron_personengruppe.bis))

            -->BIGarr .1& 1: gono8

            ------------

            while: 8