mein foreach optimieren

  • Ich habe das folgende Skript und finde es etwas ineffizient. Mit einem Array von 1 bis 3 ist dies kein echtes Problem, aber dieses Array kann viel größer werden. Wie kann man also die Leistung steigern / diesen Code optimieren?

     <?php 
    $array = array(1, 2, 3); 
    foreach ($array as $tabid)
        {
        echo '<div id="tab'. $tabid. '" class="tab_content"> 
        <ul class="columns">'; 
    
            $result = mysql_query("SELECT * FROM TabContent WHERE TabID = $tabid");
            while($row = mysql_fetch_array($result))
              {
              echo '<li><a href="#"><img src="images/layouts/'. $row['LayoutName'] .'.png" alt="" /></a>
                        <div class="info"> 
                            <h2>'. $row['LayoutName'] .'</h2> 
                            <p>'. $row['LayoutTiles'] . 'Tiles, '. $row['LayoutLayers'] . 'Layers</p>
                        </div> 
                    </li>';
              }  
       echo ' </ul>
        <div class="clear"></div>
        <div class="bottom">
            <div class="clearfix">
                <div class="lfloat"></div>
                <div class="rfloat"><a class="hide" href="#" onclick="return false">Cancel</a></div>
            </div>
        </div>  
        </div>  '; 
        }
    ?>
     

    Mit freundlichen Grüßen, Maurice

    bearbeite, optimierten Code, den ich bis jetzt habe:

     <?php
        $array = array(1, 2, 3); 
        $result = mysql_query("SELECT * FROM TabContent WHERE TabID IN (".implode(",",$array).") ORDER BY TabID");
        $tab = -1;
        while($row = mysql_fetch_assoc($result)) {
            if ($tab != $row{'TabID'}) {
                if ($tab > -1) {
                     echo '</ul>
                            <div class="clear"></div>
                            <div class="bottom">
                                <div class="clearfix">
                                    <div class="lfloat"></div>
                                    <div class="rfloat"><a class="hide" href="#" onclick="return false">Cancel</a></div>
                                </div>
                            </div>  
                        </div>  ';
                }
                $tab = $row{'TabID'}; 
                echo '<div id="tab'. $tab. '" class="tab_content">
                        <ul class="columns">'; 
            }
            echo '<li><a href="#"><img src="images/layouts/'. $row['LayoutName'].'.png" alt="" /></a> 
                    <div class="info">
                        <h2>'.$row['LayoutName'].'</h2>
                        <p>'.$row['LayoutTiles'].'Tiles, '.$row['LayoutLayers'].'Layers</p>
                    </div>
                  </li>';
        } ?>
     
    12 December 2011
    Maurice
3 answers
  • Überspringen Sie einfach das foreach und führen Sie es in einer Abfrage aus. Es gibt mehrere Möglichkeiten, dies zu tun, indem Sie beispielsweise IN http://www.techonthenet.com/sql/in.php

          $result = mysql_query("SELECT * FROM TabContent WHERE TabID IN (".implode(",",$array).") ORDER BY TabID");
     

    und befolgen Sie die tabID, wenn Sie die foreach divs und etc drucken möchten.

    EDIT: Einige Beispielcodes. Dies ist eine der vielen Möglichkeiten, die Sie können

     # code is not tested
    define('OPEN',1);
    define('CLOSE',2);
    function ul($type,$tabid = 0) {
        switch ($type) {
        case OPEN:
            return '<div id="tab'.$tabid.' class="tab_content"><ul class="columns">';
            break;
        case CLOSE:
        default:
            return '</ul><div class="clear"></div><div class="bottom"><div class="clearfix"><div class="lfloat"></div><div class="rfloat"><a class="hide" href="#" onclick="return false">Cancel</a></div></div></div>  </div>';
            break;
        }
    }
    
    $array = array(1, 2, 3); 
    $result = mysql_query("SELECT * FROM TabContent WHERE TabID IN (".implode(",",$array).") ORDER BY TabID");
    $tab = -1;
    $opened = 0;
    while($row = mysql_fetch_assoc($result)) {
        if ($tab != $row{'TabID'}) {
            if ($tab > -1) {
                 echo ul(CLOSE);
                 $opened--;
            }
            $tab = $row{'TabID'}; 
            echo ul(OPEN,$tab);
            $opened++;
        }
        echo '<li><a href="#"><img src="images/layouts/'. $row['LayoutName'].'.png" alt="" /></a> <div class="info"><h2>'.$row['LayoutName'].'</h2><p>'.$row['LayoutTiles'].'Tiles, '.$row['LayoutLayers'].'Layers</p></div></li>';
    }
    if ($opened > 0)
        echo ul(CLOSE);
     
    12 December 2011
    Trent
  • Sie können diese SQL-Anweisung

     $result = mysql_query("SELECT * FROM TabContent WHERE TabID IN (".implode(',',$array).")");
    foreach($row = mysql_fetch_assoc($result)) ....
     

    ausführen und dann Ihre foreach ausführen. Dann haben Sie weniger SQL-Anforderungen, was zu einer besseren Leistung führen könnte

    11 December 2011
  • Die Abfrage an den Datenbankserver ist eine intensive Aufgabe, statt die Abfrage in

     $result = mysql_query("SELECT * FROM TabContent WHERE TabID IN ( $valueSet) SORT BY TabID ";
     

    zu ändern Sie können $valueSet abrufen, indem Sie das obige Array zusammenfügen, und Sie erhalten eine sortierte Ausgabe, sodass Sie diese foreach -Schleife verwenden können, um alle Zeilen zu durchlaufen.

    11 December 2011
    Pradeep