Foreach-Schleife zum Generieren einer HTML-Tabelle mit dem Titel in der ersten Zelle jeder Zeile in PHP

89759
RedGiant

Ich habe ziemlich viele foreachSchleifen verwendet, um diese Art von HTML-Tabelle mit Titeln in der ersten Zelle jeder Zeile zu erhalten:

 <table>
     <thead>
        <tr>
         <th></th><th><img src='img.jpg'>Product 1</th><th><img src='img.jpg'>Product 2</th>
        </tr>
     </thead>
     <tbody>
        <tr>
          <td>Width</td><td>50mm</td><td>90mm</td>
          <td>Material</td>Plastic<td></td><td>Gold</td>
          <td>Diameter</td>60 mm<td></td><td>70mm</td>
          <td>Battery Hours</td>60 hours<td></td><td>50 hours</td>
        </tr>
     </tbody>
   </table>

Ist es notwendig, so viele foreachLoops zu verwenden? Haben Sie eine andere bessere Möglichkeit, diese Ausgabe zu erhalten?

  $sql = "SELECT * FROM product WHERE name IN ('Product 1','Product 2') ";
  if ($wpdb->query($sql))
  {
    $rows = $wpdb->last_result;
    $similar_com = "";
    $similar_com .= "<table><thead><tr><th></th>";

    foreach($rows as $row)
    { 
       $similar_com .= "<img style='width:100px;height:100px' src='".$row->image_url."' alt='".$row->model_no."'>";
    }
    $similar_com .= "</thead><tbody><tr><td>Width</td>";
    foreach($rows as $row)
    { 
       $similar_com .= "<td>$row->width mm</td>";
    }
    $similar_com .= "</tr><td>Material</td>";
    foreach($rows as $row)
    { 
       $similar_com .= "<td>$row->material</td>";
    }
    $similar_com .= "</tr><td>Case diameter</td>";
    foreach($rows as $row)
    { 
       $similar_com .= "<td>$row->case_diameter (".plus($product->case_diameter - $row->case_diameter)." mm)</td>";
    }
    $similar_com .= "</tr><td>Case thickness</td>";

    foreach($rows as $row)
    { 
       $similar_com .= "<td>$row->case_thickness (".plus($product->case_thickness - $row->case_thickness)." mm)</td>";
    }
    $similar_com .= "</tr><td>Case Material</td>";
    foreach($rows as $row)
    { 
       $similar_com .= "<td>$row->case_material</td>";
    }
    $similar_com .= "</tr><td>Battery Hours</td>";
    foreach($rows as $row)
    { 
       $similar_com .= "<td>$row->battery_hours hours</td>";
    }
    $similar_com .= "</tr><td>Special Functions</td>";
    foreach($rows as $row)
    { 
       $similar_com .= "<td>$row->special_functions</td>";
    }

    $similar_com .= "</tr></tbody></table>";
   }
Antworten
5
Sind Sie sicher, dass die HTML-Datei das Ergebnis dieses Codes ist? Ich habe `$ similar_com. =" Width ";` besonders `` gespottet Heslacher vor 6 Jahren 0

3 Antworten auf die Frage

7
Schism
  • Ist es wichtig, dass Ihr Produkt die oberste Reihe ist? Es scheint, dass Sie enorm profitieren würden, wenn Ihr Tisch so strukturiert wäre:

    <table>
        <thead>
            <tr>
                <th>Product</th>
                <th>Width</th>
                <th>Material</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <th><img /></th>
                <td>50mm</td>
                <td>Plastic</td>
            </tr>
        </tbody>
    </table>
    

    denn auf diese Weise können Sie nur eine einzige foreachSchleife verwenden:

    foreach ($rows as $row) {
        $similar_com .= "<tr>";
        $similar_com .= "<td><img style='width: 100px; height: 100px;' src='$row->image_url' alt='$row->model_no' /><br />$row->name</td>";
        $similar_com .= "<td>$row->width mm</td>";
        ...
    }
    
  • Du machst ein SELECT *. Das vermeiden; Es empfiehlt sich, die verwendeten Spalten explizit anzugeben.

  • Ich würde Ihre $rowsVariable lieber umbenennen in $products, aber ich stelle fest, dass Sie bereits eine $productVariable haben. Ich weiß nicht, was diese Variable ist, aber Sie sollten in Betracht ziehen, einige Dinge umzubenennen ... $similar_comist ein besonders nutzloser Name; Ich kann nicht sagen, was es bedeuten soll.

  • Ich habe bemerkt, dass Sie WordPress verwenden. Das $wpdb->query(); $wpdb->last_resultMuster ist nicht so gut wie einfach:

    if ($rows = $wpdb->get_results($sql) {
    
  • Wenn Sie Ihre Tabellenstruktur beibehalten müssen, können Sie für jede Zeile separate Variablen verwenden. Dann machen Sie alles in einer foreach:

    $widthRow = "<tr><th>Width</th>";
    $materialRow = "<tr><th>Material</th>";
    ...
    foreach ($rows as $row) {
        $widthRow .= "<td>$row->width mm</td>";
        $materialRow .= "<td>$row->material</td>";
        ...
    }
    $widthRow .= "</tr>";
    $materialRow .= "</tr>";
    
3
shudder

Ich würde 3 Optionen berücksichtigen:

  • Schwebende <div>s nebeneinander (eine foreach & mehrere Spalten möglich).
  • Vorlage (native PHP) ohne Schleife mit Platzhaltern wie <?php echo $rows[0]->img_url; ?>usw. Es muss davon ausgegangen werden, dass es nur zwei Spalten gibt. (+ Titelspalte).
  • Transponieren db Zeilen in Spalten unter Verwendung von nested - Array (2 Elementfeld in jedem Hauptschlüssel) innerhalb foreach Schleife: $table['image'][] = $row->image_url; $table['width'][] = .... Dann Schleife Reihen (erste Reihe wäre bedingt thoder außerhalb der zweiten Schleife).
2
Kvothe

Versuchen Sie nach dem Abrufen von $ -Zeilen wie zuvor:

$new_rows = array( '' => array(), 'Width' => array(), 'Material' => array(), 'Diameter' => array(), array());

foreach ($rows as $row) {
    $new_rows[''][] = array($row->image_url, $row->model_no);
    $new_rows['Width'][] = $row->width;
    $new_rows['Material'][] = $row->material;
    $new_rows['Diameter'][] = $row->diameter;
}

$similar_com = "<table>";

foreach ($new_rows as $key => $new_row) {

    if ($key == '') {
        $similar_com .= "<thead>";
    }

    $similar_com .= "<tr><th>" . $key . "</th>";
    foreach ($new_row as $inner_key => $item) {
        if ($key == '') {
            $similar_com .= "<th><img style='width:100px;height:100px' src='" . $item[0] . "' alt='" . $item[1] . "'>Product " . $inner_key . "</th>;
        }
        else {
            $similar_com .= "<td>" . $item;
            if ($key == "Width" || $key == "Diameter") {
                $similar_com .= " mm";
            }
            $similar_com .= "</td>
        }
    }

    $similar_com .= "</tr>";
    if ($key == '') {
        $similar_com .= "</thead>";
    }
}

$similar_com .= "</table>";

echo $similar_com;

Ich habe nicht alle Ihre Felder einbezogen, aber es sollte ziemlich offensichtlich sein, wie man sie hinzufügt (denke ich).

Während ich dies schrieb, überlegte ich mir einen Weg, es mit nur 2 statt mit 3 foreach-Schleifen zu tun, aber der Code wird dadurch weniger lesbar und wiederverwendbar. Lassen Sie mich wissen, ob Sie es wollen und ich werde es als weitere Antwort posten.

Erläuterung:

Die Variable $ rows gibt etwas vom Formular zurück:

$rows = array(
    [0] => array('field1_val', 'field2_val', ...),    //first result
    [1] => array(...),    //second result
    ...    //and so on for however many RECORDS there are
);

Durch das Durchlaufen dieser Schleife wird jedoch jeweils ein Datensatz zurückgegeben, wohingegen wir jeweils ein Feld haben möchten. Daher müssen die Daten in ein Array wie folgt umgeordnet werden:

$new_rows = array(
    ['field1'] => array('result1_val', 'result2_val', ...),    //each record's value for the first field
    ['field2'] => array(...),    //each record's value for the second field
    ...    //and so on for however many FIELDS there are
);

Nun ist also die Größe des äußeren Arrays die Anzahl der Felder, und die inneren Arrays haben jeweils die gleiche Größe wie die Anzahl der zurückgegebenen Datensätze. Wir haben also die ursprüngliche $ rows-Variable umgedreht. Beim Durchlaufen dieses Arrays mit foreach erhalten Sie jedes Mal ein Array der Feldwerte. Das ist der Zweck der ersten foreach-Schleife in meinem Code (um ein Array der Daten dieses Formulars zu generieren). Ich habe auch beschlossen, die ersten beiden Felder in einer "Zeile" zu gruppieren, da beide in der Tabelle in der Tabelle angezeigt werden sollen gleiche Reihe.

Die nächste foreach-Schleife startet die Tabelle - hier werden Feldnamen als Schlüssel des Arrays verwendet. Sie drucken einfach den Schlüssel aus, um den Feldnamen zu erhalten, anstatt etwas zu verwenden:

switch ($key) {
    case 0:
        $similar_com .= "";
        break;
    case 1:
        $similar_com .= "Width";
    ...    //etc
}

Innerhalb dieser Schleife benötigen Sie eine dritte Foreach-Schleife, die den Wert jedes Datensatzes für dieses Feld durchläuft und ihn druckt.

Hoffe das ist jetzt klarer.

Warum machst du das so? Bitte fügen Sie der Antwort einige Erklärungen hinzu, damit die Antwort als Review besser passt. Danke dir Malachi vor 6 Jahren 0