【问题标题】:Foreach php variable value create while loopForeach php 变量值创建 while 循环
【发布时间】:2010-12-13 09:35:30
【问题描述】:

我有一张这样的桌子,里面摆满了订单,每个客户都会有多个订单:

Customer   ponumber quantity ..

customer1   234345     56
customer2   343454     34
customer1   w34234     54
customer5   332423     54

我正在尝试遍历每个 DISTINCT 客户并使用以下代码打印相应的订单。

<?php

include("php/database_connect.php");

  $query = mysql_query("SELECT DISTINCT customer FROM orders");
  $customer = mysql_fetch_array($query);

foreach($customer as $customers)
{

echo ' <li><h1>'. $customers . '</h1></li>';

$result = mysql_query("SELECT * FROM orders WHERE misc='new' AND customer='$customers'       ORDER BY columnpos ASC ");

while($row = mysql_fetch_array($result))

         {
         echo'  

         <li id="id_' . $row['id'] . '">
         <div class="card">

         <table>
         <tr>
         <td>' . $row['customer'] . '</td>
         <tr>
         <td>P/O: ' . $row['ponumber'] . '</td>
         </tr>
         <tr>
         <td>' . $row['partnumber'] . '</td>
         </tr>
         <tr>
         <td><b>' . $row['quantity'] . '</b> x ' . $row['foil'] . '</td>
         </tr>
         <tr>
         <td>' . $row['daterequired'] . '</td>
         </tr>
         <tr>
         <td>' . $row['prep'] . '</td>
         </tr>
         </table>
        <input class="hiddenid" type="hidden" value="' . $row['id'] . '" />
         <input class="hiddenquantity" type="hidden" value="' .     $row['quantity'] . '" />
         <input class="hiddenpartnumber" type="hidden" value="' .   $row['partnumber'] . '" />
         <input class="hiddenfoil" type="hidden" value="' . $row['foil'] . '" />
         </div>
         </li>


         ';
         }
}
?>

但是上面的代码当前打印:

customer1 234345
customer1 w34234

customer1 234345
customer1 w34234

这似乎很奇怪......它没有通过每个客户。

非常感谢任何帮助!

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    只进行一次数据库查询(性能更好),但在循环之前处理结果:

    $result = mysql_query("SELECT * FROM orders WHERE misc='new' ORDER BY customer ASC ");
    
    $ordersByCustomer = array(); // nested array. 1. level: customers, 2. level: orders
    
    while(($row = mysql_fetch_assoc($result))) {
        if(!array_key_exists($row['customer'], $ordersByCustomer)) {
            $ordersByCustomer[$row['customer']] = array();
        }
        $ordersByCustomer[$row['customer']][] = $row;
    }
    
    foreach($ordersByCustomer as $customer=>$orders) {
        echo ' <li><h1>'. $customer . '</h1></li>';
        foreach($orders as $order) {
            // rest of HTML code
        }
    }
    

    我还鼓励您更好地分离 HTML 和 PHP,就像这样,使用 alternative syntax for control structures:

    <?php foreach($ordersByCustomer as $customer=>$orders): ?>
        <li><h1><?php echo $customer; ?></h1></li>
        <?php foreach($orders as $order): ?>
            <li id="id_<?php echo $row['id'];?>">
                <div class="card">
                    <table>
                        <tr><td><?php echo $order['customer']; ?></td></tr>
                        <!-- and so forth -->
        <?php endforeach; ?>
    <?php endforeach; ?>
    

    顺便说一句,您没有生成有效的 HTML。 li 元素必须包含在 ulol 元素中。

    【讨论】:

    • 感谢您的回复。我认为您的操作水平比我高得多,我很难理解这一点。感谢您指出控制结构链接的替代语法,我想知道是否有更好的方法在 html 中构建 php。抱歉,我忘记在
        标记中包含其余代码。
    • @Alex:如果你对上面的代码有什么不明白的地方,可以评论问我:)
    • 1 DB 请求比 N+1 更好,从视图中分离逻辑总是好主意。
    • 啊,我明白了,我在每次 while 操作后发出一个请求,我可以对所有内容发出一个请求,然后排序并显示。我现在要研究你的代码...
    • @Alex:我的代码有一个小错误。在最后一个例子中,当然它必须是$order['customer'],因为循环是foreach($orders as $order)...
    【解决方案2】:

    使用

    while($customer = mysql_fetch_array($query){
    

    而不是

    $customer = mysql_fetch_array($query);
    
    foreach($customer as $customers)
    {
    

    【讨论】:

    • 谢谢!这解决了我的问题。简单,有效,我应该发现它。
    猜你喜欢
    • 1970-01-01
    • 2021-12-02
    • 2015-07-03
    • 2014-10-19
    • 2020-01-16
    • 2018-06-17
    • 1970-01-01
    • 2019-10-14
    • 2018-02-09
    相关资源
    最近更新 更多