Chris Ross: while(dynamisch) - Wie?

Hallo Forum,

ich möchte die Anweisung in den while-Klammern dynamisch zuweisen, weil ich einmal eine Datenbankanfrage, oder aber ein Array als Datenquelle durchlaufen möchte. Ähnlich so:

if(test == 1) { // Array als Datenquelle
 $schleife = "list($key, $data) = each ($daten)";
}
else { // Hole Daten aus Datenbank
 $schleife = "$data = $site_db->fetch_array($sql)";
}
while($schleife) {
viele Befehle
}

somit müsste die while-anweisung einmal: while( list($key, $data) = each ($daten) ) {
oder aber: while( $data = $site_db->fetch_array($sql) ) {
lauten.

Diese Möglichkeiten funktionieren nicht, weil - so nehme ich an - es sich um einen String handelt, der eingefügt werden soll und somit der Typ nicht stimmt, der erforderlich ist um in den while-klammer stehen zu können.

Ich weiß, das einfachste wäre wohl, die zu verarbeiteten Befehle innerhalb der Schleife einmal per while und einmal per foreach abzuarbeiten. Das möchte ich aber im Grunde nicht, denn das bedeutet doppelter Quellcode, der imho nicht nötig ist.

Hat jemand ne Idee zu meinem Vorhaben? Würde mich freuen, wenn mir mal kurz jemand aufs Pferd helfen könnte.

Mit freundlichen Grüßen
Chris

  1. Hallo,

    ich möchte die Anweisung in den while-Klammern dynamisch zuweisen, weil ich einmal eine Datenbankanfrage, oder aber ein Array als Datenquelle durchlaufen möchte. Ähnlich so:

    in php kannst du typen von variablen überprüfen (die is_* familie), generell lässt sich für soetwas ein iterator verwenden.

    --
    no strict;
    no warnings;
    79.78 cups of Coffee (Brewed) + Me = Death
    Terrorific!
    1. Hi,

      darauf bin auch schon gekommen, aber mit gettype(list($key, $data) = eaech($daten)) kommt "array", sowie bei der anderen Version "boolean" - was aber auch logisch ist, denn ich frage den gettype ohne die " ab, denn dann käme logischerweise "string".

      Damit scheidet die Typprüfung aus. :/

      Trotzdem Danke!

      MfG Chris

      Hallo,
        in php kannst du typen von variablen überprüfen (die is_* familie), generell lässt sich für soetwas ein iterator verwenden.

  2. Hi,

    ich möchte die Anweisung in den while-Klammern dynamisch zuweisen, weil ich einmal eine Datenbankanfrage, oder aber ein Array als Datenquelle durchlaufen möchte. Ähnlich so:

    if(test == 1) { // Array als Datenquelle
    $schleife = "list($key, $data) = each ($daten)";
    }
    else { // Hole Daten aus Datenbank
    $schleife = "$data = $site_db->fetch_array($sql)";
    }
    while($schleife) {
    viele Befehle
    }

    Mach aus "viele Befehle" eine Funktion.
    Und mach im if-Zweig eine Schleife und im else-Zweig eine andere, wobei innerhalb der Schleifen jeweils die Funktion "viele Befehle" aufgerufen wird.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  3. Hi,

      
    while(1)  
    {  
        if ($datenquelle=="datenbank")  
            if (!($data = $site_db->fetch_array($sql))) break;  
        else  
            if (!(list($key, $data) = each ($daten))) break;  
        [...]  
    }  
    
    

    Schöne Grüße
    Julian

    --
    "Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning." - Rich Cook
    http://derjulian.net
  4. Hi zusammen,

    Eure Tipps haben mir geholfen!

    Ich habe das jetzt so gelöst:

    if(test == 1) {
     $sql    = $site_db->query("SELECT id, herst, bez, typ, sernr, bemerk, coords, zbv FROM maschinen WHERE standort = 'Schleiferei'");
     $anz = 0;

    while($dat[$anz] = $site_db->fetch_array($sql)) {
      $daten[$anz] = $dat[$anz];
      $anz++;
     }

    }
    else {
     $where  = array("Versand", "Handfertigung", "Betriebstechnik", "Druckluftraum");

    foreach($where as $key) {
      $sql = $site_db->query("SELECT id, herst, bez, typ, sernr, bemerk, coords, zbv FROM maschinen WHERE standort = '".$key."'");
      $anz = 0;

    while($dat[$key] = $site_db->fetch_array($sql)) {
       $daten[$anz] = $dat[$key];
       $anz++;
      }

    $anz = 0;
     }

    }

    while(list($key, $data) = each ($daten)) {
     viele Befehle
    }

    Danke nochmal!

    Gruß
    Chris

    1. echo $begrüßung;

      Ich habe das jetzt so gelöst:

      Das Prinzip dieser Lösung ist schon mal gut. Du trennst damit das Erzeugen/Abfragen der Daten von deren Verarbeitung. Durch diese Trennung fällt es später einmal leichter, die einzelnen Aufgaben auszulagern oder zu überarbeiten, ohne dass der andere Teil in Mitleidenschaft gezogen wird.
      Doch einige Details sind verbesserungsfähig.

      if(test == 1) {
      $sql    = $site_db->query("SELECT id, herst, bez, typ, sernr, bemerk, coords, zbv FROM maschinen WHERE standort = 'Schleiferei'");
      $anz = 0;

      while($dat[$anz] = $site_db->fetch_array($sql)) {
        $daten[$anz] = $dat[$anz];
        $anz++;
      }
      }

      Wofür nimmst du diese Zählvariable $anz? Beim Verwenden von leeren Klammern hinter einer Array-Variable ($array[]) wird der Key automatisch von 0 an fortlaufend hochgezählt.[1]
      Es ist auch nicht nötig, die Elemente eines weiteren Arrays als Zwischenvariable zu verwenden. Eine normale Variable reicht dafür. Durch das Wiederverwenden wird auch nicht unnötig viel Speicher für Nichts verwendet.
      Auch ist es empfehlenswert, das Array das die abzufragenden Datensätze aufnehmen soll, als Array zu initialisieren, sonst fällst du später auf die Nase, wenn du bei einer Abfrage, die keine Datensätze liefert, das nicht vorhanden Array mittels foreach durchlaufen willst.

      $sql = $site_db->query("...");
        $daten = array();
        while ($record = $site_db->fetch_array($sql))
          $daten[] = $record;

      else {
      $where  = array("Versand", "Handfertigung", "Betriebstechnik", "Druckluftraum");

      foreach($where as $key) {
        $sql = $site_db->query("SELECT id, herst, bez, typ, sernr, bemerk, coords, zbv FROM maschinen WHERE standort = '".$key."'");

      Warum nimmst du hier nicht eine einzelne Abfrage mit OR-verknüpfter Bedingung statt 4 einzelner Abfragen? Jede einzelne Abfrage ist "teuer", weil sie neu geparst werden muss, und der Datenbestand muss erneut durchsucht werden.

      $query = "SELECT ... WHERE standort='" . implode("' OR standort='", $where) . "'";
        // echo $query; // Kontrollausgabe, um zu sehen, dass die Abfrage richtig zusammengesetzt wird
        $sql = $site_db->query($query);
        // weiter wie oben

      while(list($key, $data) = each ($daten)) {
      viele Befehle
      }

      Statt while-list-each zum Durchlaufen eines Array nimmt man besser als foreach:

      foreach ($array as $key => $value)

      echo "$verabschiedung $name";

      [1] Genauer gesagt: Ein [] bewirkt, dass der bis jetzt höchste numerische Key-Wert um eins erhöht als Key für das neue Element verwendet wird.