Ankündigung

Einklappen
Keine Ankündigung bisher.

Die benötigte While-Schleife ist mir zu komplex, helft!

Einklappen

Neue Werbung 2019

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

  • Die benötigte While-Schleife ist mir zu komplex, helft!

    Hallo, vielen Dank für's Vorbeischauen.

    Es ist eine Tabelle vorhanden, aus der ich die Länder meiner Besucher nach Häufigkeit auslese:

    Code:
      
    $Befehl="Select `Country`, COUNT(*) as `Amount` ". // Länderstatistik
              "from `FNR_Visitors` ".
              "group by `Country` ".
              "order by `Amount` desc";
    Aus diesem Ergebnis will ich eine Statistik (JPGraph) erstellen. Aus Gründen der Übersichtlicjkeit soll diese Statistik in einzelne Abschnitten von maximal 10 Einträgen (Ländern) und als elften Eintrag der verbliebene Rest an Besuchen (der anderen Länder) aufgeteilt sein. Die jeweils verbliebenen "Rest-"Länder werden dann immer im nächsten Stistikabschnitt dargestellt, so lange, bis keine Länder mehr übrig sind (While-Schleife). Kann also sein, das der letzte Statistikabschnitt weniger als 10 Länder (und natürlich keinen Rest) darstellt.

    Code:
       $Country[]=$Datensatz["Country"]; // Einzelne Länder
       $CountryAndAmount[]=$Datensatz["Country"].": ".$Datensatz["Amount"]."x"; // Einzelne Länder mit ihren Anzahlen (Besuche)
       $AmountCountries++; // Anzahl der Länder
       $Visitors=$Visitors+$Datensatz["Amount"]; // Anzahlen (Besuche) insgesamt
       $Visits[]=$Datensatz["Amount"]; // Einzelne Anzahlen (Besuche)
    Der Code oben zeigt die benötigten Variablen an, die ich erstellen muß, um den Statistikabschnitt mit Werten und Texten zu versorgen.

    Nun zum Problem. Bis jetzt hatte ich die einzelnen Abschnitte einzeln kodietrt, also ohne While-Schleife. Die Anzahl der Besucherländer BIS JETZT ist 36, also musste ich 4 Abschnitte einzeln erstellen. Da ich aber nicht weiß, bei welcher Länderanzahl ich irgendwann landen werden, möchte ich die Erstellung automatisieren mit einer While(noch Länder übrig)-Schleife.

    Hier die URL meiner Website, schaut Euch dort "About Us || Demographic Data" an: http://Navis.TerraRomana.org.

    Gerne schicke ich auch den PHP-Sourcode der entsprechenden Seite komplett zu, wenn dies Eurem Verständnis hilft.

    Vielen Dan für Eure Zeit, Absicht, Mühe und Hilfe.

    Sven
    sigpic
    Vielen Dank für Eure Zeit, Absicht, Mühe und für Eure Ideen. Grüße,
    Sven

  • #2
    Warum legst Du die Elemente der einzelnen Datensätze in den Felder $Country, $CountryAndAmount usw ab?

    Wenn Du die Datensätze zusammengehörig abspeicherst, kannst Du sie bspw mit array_chunk in 10er Gruppen aufteilen.
    PHP-Code:
    <?php
    $records 
    = array(    
        array(
    'Country'=>'a''Amount'=> 1), array('Country'=>'b''Amount'=> 2),
        array(
    'Country'=>'c''Amount'=> 3), array('Country'=>'d''Amount'=> 4),
        array(
    'Country'=>'e''Amount'=> 5), array('Country'=>'f''Amount'=> 6),
        array(
    'Country'=>'g''Amount'=> 7), array('Country'=>'h''Amount'=> 8),
        array(
    'Country'=>'i''Amount'=> 9), array('Country'=>'j''Amount'=>10),
        array(
    'Country'=>'k''Amount'=>11), array('Country'=>'l''Amount'=>12),
        array(
    'Country'=>'m''Amount'=>13), array('Country'=>'n''Amount'=>14),
        array(
    'Country'=>'o''Amount'=>15), array('Country'=>'p''Amount'=>16),
        array(
    'Country'=>'q''Amount'=>17), array('Country'=>'r''Amount'=>18),
        array(
    'Country'=>'s''Amount'=>19), array('Country'=>'t''Amount'=>20),
        array(
    'Country'=>'u''Amount'=>21), array('Country'=>'v''Amount'=>22),
        array(
    'Country'=>'w''Amount'=>23), array('Country'=>'x''Amount'=>24),
        array(
    'Country'=>'y''Amount'=>25), array('Country'=>'z''Amount'=>26)
    );

    $groups array_chunk($records10);


    $groupno 0;
    foreach(
    $groups as $group) {
        ++
    $groupno;
        
        echo 
    '--- Gruppe #'$groupno' ---'"
    \n"
    ;
        foreach(
    $group as $entry) {
            echo 
    $entry['Country'], ' : '$entry['Amount'], "
    \n"
    ;
        }
    }
    ?>

    Kommentar


    • #3
      Hallo Bruchpilot,

      ich kannte nicht mal die Funtionen RECORD und ARRAY_CHUNK. Vieleicht ist es ja wirklich das, was es einfacher macht. Aber auch das Doppel-Plus VOR einer Variablen kenne ich nicht.

      Soll ich Dir mal die Tabelle und den Seiten-Quellcode übermitteln? Dann kannst Du genau nachvollziehen, wie der Aufbau der Tabelle ist. Ich muß gestehen, daß in Deinem Vorschlag zwar interessante Ideen stecken, ich sie aber nicht richtig umsetzen kann (da mir einige Dinge fremd sind).

      Bitte melde Dich bei mir. Aber trotzdem, schon jetzt vielen Dank für Zeit und Mühe!

      Sven
      sigpic
      Vielen Dank für Eure Zeit, Absicht, Mühe und für Eure Ideen. Grüße,
      Sven

      Kommentar


      • #4
        Zitat von SvenLittkowski
        Aber auch das Doppel-Plus VOR einer Variablen kenne ich nicht.
        Es gibt Post- ($i++) und Präinkrement (++$i). Bei Postinkrement wird zunächst der aktuelle Wert der Variablen zurückgegeben und anschließend erhöht, bei Präinkrement wird zuerst erhöht und erst danach der neue Wert zurückgegeben.

        Kommentar


        • #5
          Hier ist der komplette Code (als ZIP-Datei gepackt): http://Navis.TerraRomana.org/PHP_MySQL.zip

          Zum Inhalt:

          _PHP (die PHP-Page)
          DbConn und DbClose managen die DB-Verbindung, als Grafikcode wird JPGraph verwendet. Es funktioniert zwar alles ordnungsgemäß, aber diese Art von Code verdammt mich zum manuellen Anpassen, wann immer die Zahl der Länder eine gewisse Grenze überschreitet.

          _MySQL
          Nun noch der MySQL-Code, der eine MySQL-Dabelle mit den Ländereinträgen erstellt.

          Grüße,

          Sven
          sigpic
          Vielen Dank für Eure Zeit, Absicht, Mühe und für Eure Ideen. Grüße,
          Sven

          Kommentar


          • #6
            Muss es sein, 260 INSERTs zu posten?
            Dich sollte man hier bannen.

            Außerdem gibts Arrays. Du hast nen krassen Overhead ^^

            Kommentar


            • #7
              Zergling:

              Kannst Du genauer auf den "Overhead" eingehen? Wenn es mir hilft, die ganze Sache effektiver zu machen, wäre es sehr gut.

              Das Posting habe ich gegen eine URL eingetauscht, Du hast recht.

              Sven
              sigpic
              Vielen Dank für Eure Zeit, Absicht, Mühe und für Eure Ideen. Grüße,
              Sven

              Kommentar


              • #8
                Hallo, also als ZIP packen schreckt noch mehr ab dir zu helfen. Zuviel Aufwand.
                http://nopaste.php-q.net

                Egal. Also mit Overhead meinte ich soetwas:

                PHP-Code:
                <?php
                if($Number[30]) $Number04[0]=$Number[30];
                if(
                $Number[31]) $Number04[1]=$Number[31];
                //...
                if($Country01[0]) $News2="<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"730\" class=\"Contents\">\n".
                         
                "<tr>\n".
                         
                "<td width=\"500\" align=\"left\" valign=\"top\">\n".
                         
                $DataCountries01."\n".
                         
                "</td>\n".
                         
                "<td width=\"10\" align=\"left\" valign=\"top\">\n".
                         
                "</td>\n".
                         
                "<td width=\"40\" align=\"right\" valign=\"top\">\n".
                         
                "[b]Visits[/b]
                "
                .implode("x
                "
                ,$Number01)."x".
                         
                "</td>\n".
                         
                "<td width=\"10\" align=\"left\" valign=\"top\">\n".
                         
                "</td>\n".
                         
                "<td width=\"170\" align=\"left\" valign=\"top\">\n".
                         
                "[b]from Country[/b]
                "
                .implode("
                "
                ,$Country01).
                         
                "</td>\n".
                         
                "</tr>\n".
                         
                "</table>\n";
                  if(
                $Country02[0]) $News2.="
                //...
                ?>
                Merk dir erstmal pauschal, doppelter Code ist schlecht, da mühselig zu bearbeiten und dadurch kanns passieren, dass ich einen Teil vergesse.
                Auch schlecht ist es, fortlaufende Zahlen in Variablennamen zu verwenden. Dafür gibts es (mehrdimensionale) Arrays.

                Erkenne Muster!

                PHP-Code:
                <?php
                // dein Code:
                  
                if($Number[10]) $Number02[0]=$Number[10];
                  if(
                $Number[11]) $Number02[1]=$Number[11];
                  if(
                $Number[12]) $Number02[2]=$Number[12];
                  if(
                $Number[13]) $Number02[3]=$Number[13];
                  if(
                $Number[14]) $Number02[4]=$Number[14];
                  if(
                $Number[15]) $Number02[5]=$Number[15];
                  if(
                $Number[16]) $Number02[6]=$Number[16];
                  if(
                $Number[17]) $Number02[7]=$Number[17];
                  if(
                $Number[18]) $Number02[8]=$Number[18];
                  if(
                $Number[19]) $Number02[9]=$Number[19];
                // fällt dir was auf? 10 - 0 - 10, 11 - 1 - 11, ...
                // wie wärs mit
                for ($i 10$i <= 19$i++) {
                  
                $Number02[$i 10] = $Number[$i];
                }
                ?>
                Dann kommt später auch noch das hier von dir:

                PHP-Code:
                <?php
                  
                if($Number[20]) $Number03[0]=$Number[20];
                  if(
                $Number[21]) $Number03[1]=$Number[21];
                  if(
                $Number[22]) $Number03[2]=$Number[22];
                  if(
                $Number[23]) $Number03[3]=$Number[23];
                  if(
                $Number[24]) $Number03[4]=$Number[24];
                  if(
                $Number[25]) $Number03[5]=$Number[25];
                  if(
                $Number[26]) $Number03[6]=$Number[26];
                  if(
                $Number[27]) $Number03[7]=$Number[27];
                  if(
                $Number[28]) $Number03[8]=$Number[28];
                  if(
                $Number[29]) $Number03[9]=$Number[29];
                // das gleiche in grün...
                // packen wir mal alles in die Schleife
                for ($i 0$i 5$i++) {
                  
                $I "0" + ($i 1); // aus 1 wird 02 ..
                  
                for ($k 0$k 10$k++) {
                    
                $Number{$I}[$k] = $Number[$i 10 $k];
                  }
                }
                ?>
                Aus 50 Zeilen von dir, habe ich effektiv 4 gemacht ( }-Zeilen nicht mitgezählt). Und so kann ich haufenweise weitermachen bei dir...

                Aber wenn ich noch mehr "rationalisiere" komm ich hier selbst garnicht mehr zum arbeiten, aber überdenk dein Skript nochmal komplett.

                Kommentar

                Lädt...
                X