Ankündigung

Einklappen
Keine Ankündigung bisher.

Schleife erzeugen anhand eines Arrays

Einklappen

Neue Werbung 2019

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

  • Schleife erzeugen anhand eines Arrays

    Ich versuche jetzt schon seit zwei Tagen eine Funktion zu schreiben die Abfragen anhand des Inhalts eines Arrays durchführt. Alleine gebe ich es auf, eventuell habe ich ja einen völlig falschen Ansatz gewählt.

    Über ein Formular (POST) werden "ID's" übertragen welche ich dann in ein Array packe. Das funktioniert soweit 1A:
    PHP-Code:
    Array
    (
        [
    0] => 638
        
    [1] => 639
        
    [2] => 640
        
    [3] => 641
        
    [4] => 642
        
    [5] => 643
        
    [6] => 644
        
    [7] => 645
        
    [8] => 1912
        
    [9] => 1914
        
    [10] => 1916
        
    [11] => 1918
        
    [12] => 4005
        
    [13] => 11936

    Diese IDs brauche ich um von einer externen Seite Daten per XML anzufragen. Jetzt ist es aber so, dass ich maximal ca. 50 ID's gleichzeitig abfragen kann. Deswegen habe ich versucht eine Schleife zu erstellen. Mit der Funktion "array_slice" nehme ich mir die ersten 50 ID's und mache dann die Abfrage, dann sollen weitere 50 aus dem Array genommen werden usw.

    Die Abfrage inkl. Schleife funktioniert, allerdings wird entweder zu viel abgefragt oder zu wenig.

    Versucht hatte ich mittlerweile fast alles, for-Schleifen, do-while-Schleifen, if, elseif usw.

    Hier ist mein aktueller Versuch:
    PHP-Code:
    <?php
    $items 
    count ($typeIDs); // TOTAL ID's aus dem Array 
    $max_query 40// Maximal 40 IDs pro Abfrage
    $queries ceil ($items $max_query); //rundet $items / $max_query auf ganze Zahl. Bestimmt die Abfrageanzahl.
    $counter 0// Zähler für Abfragen. Wird zusammen mit $queries für Schleifen und IF Argumente benötigt.
    $start_slice 0// Variable für array_slice
    $end_slice 41// Variable für array_slice 

    if ($items $max_query) {  // Wenn mehr als 41 ID starte Schleife    

        
    do {    
        
        
    $sliced=array_slice($typeIDs$start_slice$end_slice);
        foreach(
    $sliced as $typeid) {
            echo 
    "<tr><td>$typeid</td><td>$start_slice</td><td>$end_slice</td></tr>";
        }
        if (
    $counter >= 1) { //slice Variablen sollen erst ab dem zweiten Durchgang erhöht werden, ansonsten startet es nicht bei 0
            
    $start_slice $start_slice 41;
            
    $end_slice $end_slice 41;
        }
        elseif (
    $counter $queries) { //führe diesen Code aus bei der letzten Abfrage. Bei zwei Abfragen wird nur dieser Block ausgeführt.
            
    $end_slice = ($items $end_slice)+$end_slice//ermittelt die grösste/letzte NR im Array
            
    $start_slice $start_slice 41;
            
        }
        else {
                
    //keine Verwendung :(
        
    }        

        
    $counter $counter ;
        }while (
    $counter $queries);    
    }

    else {
        
    //führe normalen code aus ohne schleife    
    }
    ?>
    Als Beispiel habe ich 69 ID's abgefragt. Davon werden aber nur 41 ausgegeben.



    Das elseif wird ausgeführt und die Variablen haben auch die korrekten Werte, ich gehe aber davon aus, weil das foreach oben im Code ist, werden diese Variablen gar nicht mehr berücksichtigt.

    Liege ich da richtig? Und noch wichtiger, gäbe es hierfür einen einfacheren Weg?

  • #2
    wo exact liegt dein problem?

    Kommentar


    • #3
      Sowas?
      PHP-Code:
      <?php

        $data 
      range (1500);
        
      $i 1;
        while(
      count($data))
        {
           
      $part array_splice($data050);
           
           echo 
      "Array = " $i++ . "<br>";
           
      print_r($part);
           echo 
      "<br>";
        }
      ?>
      Die Deutsche Rechtschreibung ist Freeware! Du darfst sie kostenlos nutzen, allerdings ist sie nicht Open Source, d.h. Du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

      Kommentar


      • #4
        Ich nehme an $data = range (1, 500); kann ich durch mein ID Array ersetzten, oder?

        So ganz funktionieren tut die Sache nicht aber ich denke dein Beispiel macht mehr Sinn und es ist auch viel weniger Code.

        edit:
        Es funktioniert jetzt wie es sollte. Vielen Dank.
        Das war der Schlüssel:

        PHP-Code:
        <?php

        while(count($typeIDs))
        {
            
        $part array_splice($typeIDs050);
            
        //abfragecode

            
        }
         
        ?>

        Kommentar


        • #5
          zuerst einmal: hier führt dein script eine zuweisung und keinen vergleich durch:

          PHP-Code:
              elseif ($counter $queries) { # <-- = -> zuweisung, == oder === -> vergleich ) 
          Zum anderen, pagination ist bei kleinen Datenmengen ( < 1000 ) immernoch sehr performant wenn man die Datenmenge einfach nur chunked:

          PHP-Code:
          <?php

          $data 
          range(1,1000);
          $data array_map('uniqid'$data);

          // config

          $itemsPerCharge 25;

          // inbound

          $page filter_has_var(INPUT_GET'page' ) ? (int) $_GET['page'] - 0;

          $targetData array_chunk($data$itemsPerCharge);

          if ( ! 
          array_key_exists($page$targetData) ) {
              throw new 
          OutOfBoundsException('Page does not extists: '.$page);
          }

          //

          foreach ( $targetData[$page] as $key => $value ) {
              
          // ...
          }
          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

          Kommentar


          • #6
            Mal so nebenbei.. aus Interesse. Welches Plugin nutzt du da für deine Tabelle?^^
            No Sacrifice , no Glory--

            Kommentar


            • #7
              Sieht nach Bootstrap und Datatables aus
              [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

              Kommentar


              • #8
                Richtig

                Ich nutze Datatables(.net) weil ich mich ursprünglich in Javascript einarbeiten wollte. Vielleicht gibt es für PHP & MySQL bessere DataGrids aber ja, eins nach dem anderen.

                Ich musste leider feststellen dass irgendwas noch nicht 100% funktioniert. In meiner DB erhalte ich Datensätze mit 0 Werten, obwohl es eigentlich kein 0-Wert sein sollte. Das kann ja spannend werden.

                edit:
                Soweit scheint es an der Quelle (XML) zu liegen. Somit sollte es doch richtig funktionieren.

                Kommentar

                Lädt...
                X