【问题标题】:PHP Array is carrying too many elementsPHP Array 包含太多元素
【发布时间】:2013-04-23 12:23:45
【问题描述】:
<?php
$query = "SELECT name FROM prodGroups";
$result = mysql_query($query);
$prodGroups = array();
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    $prodGroups[] = $row['name'];
}
if (count($prodGroups) == 0) // IF NO PRODUCT GROUPS EXIST
    for ($j=1 ; $j<4 ; $j++)
    {
        echo "<li><a href='#'><span>Empty product group " . $j . "</span></a></li>";
    }
else // FOR WHEN PRODUCT GROUPS DO EXIST
    foreach ($prodGroups as $aGroup) // CYCLE THROUGH PRODUCT GROUPS
    {
        echo "<li class='submenu'><a href='#'><span>" . $aGroup . "</span></a>";
        $query = "SELECT name FROM products WHERE prodGroup='$aGroup'";
        $result = mysql_query($query);

        for ($j=0 ; $j<count($prodGroups) ; ++$j)
        {
            while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) // PLACE PRODUCTS INTO AN ARRAY
            **{
                $products[] = $row['name'];
            }**
            if (!isset($products)) // IF THERE ARE NO PRODUCTS INSIDE A PRODUCT GROUP
                echo "<ul><li><a href='#'><span>No products</span></a></li></ul></li>";
            else // FOR WHEN PRODUCT(S) DO EXIST INSIDE A PRODUCT GROUP
            {
                echo "<ul>";
                if(isset($products))
                    foreach ($products as $item) // CYCLE THROUGH PRODUCTS
                    {
                        echo "<li><a href='#'><span>" . $item . "</span></a>";
                    }
                echo "</ul></li>";
            }
        }
    }

?>

在哪里$products[] = $row['name'];它携带所有元素,而我只是希望它携带产品名称到它们与 prodGroup 名称匹配的位置?我尝试使用 unset() 删除循环中的数组内容,但是这只允许每个循环中的数组中有一个元素。

【问题讨论】:

  • 您可以使用 mysql_num_row($result) 来测试数据。然后在 while 中进行处理而不是构造 $products (即 echo '
  • ...';
  • 这个循环的目的是什么:for ($j=0 ; $j&lt;count($prodGroups) ; ++$j)?好像没必要
  • $products 重置为每个 prodGroup 的空数组(这可能意味着您想使用 empty($products) 而不是 !isset($products);
  • Please, don't use mysql_* functions in new code。它们不再维护and are officially deprecated。看到red box?改为了解 prepared statements,并使用 PDOMySQLi - this article 将帮助您决定哪个。
  • 标签: php mysql arrays loops


    【解决方案1】:

    添加$products = array(); 紧接着:

       foreach ($prodGroups as $aGroup) // CYCLE THROUGH PRODUCT GROUPS
        {
    

    【讨论】:

    • 太棒了,不敢相信这是这么小的东西。我以为数组在我分配 '$row['name']' 时就已经定义了。还有很多学习要做!非常感谢,非常感谢!
    • @user2324069:很高兴为您提供帮助,伙计 :)
    • @user2324069 - 如果您希望进一步提高该页面的性能,您可以使用更复杂的查询在 MySQL 端进行更多此类处理。
    【解决方案2】:

    我试图重写你的循环,修复了几个问题,其中大部分都是小问题。我评论了我的更改。看看这是否适合你。

    foreach ($prodGroups as $aGroup) // CYCLE THROUGH PRODUCT GROUPS
        {
            echo "<li class='submenu'><a href='#'><span>" . $aGroup . "</span></a>";
            $query = "SELECT name FROM products WHERE prodGroup='$aGroup'";
            $result = mysql_query($query);
    
            //for loop here has been taken out
                while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) // PLACE PRODUCTS INTO AN ARRAY
                {
                    $products[] = $row['name'];
                }
                if (!isset($products)) // IF THERE ARE NO PRODUCTS INSIDE A PRODUCT GROUP
                    echo "<ul><li><a href='#'><span>No products</span></a></li></ul>";
                else // FOR WHEN PRODUCT(S) DO EXIST INSIDE A PRODUCT GROUP
                {
                    echo "<ul>";
                    //if(isset($products)) - You already checked this..
                        foreach ($products as $item) // CYCLE THROUGH PRODUCTS
                        {
                            echo "<li><a href='#'><span>" . $item . "</span></a></li>"; //Don't forget to close this li
                        }
                    echo "</ul>";
                }
                echo '</li>'; //close li here
                unset($products); //unset $products for next loop iteration
    
        }
    

    当然,请不要使用已弃用的 mysql 扩展。请参阅@FreshPrinceOfSO 的评论。

    【讨论】:

    • 这些 cmets 和更改对我来说非常有价值,再次感谢!
    【解决方案3】:

    这应该让你明白我使用mysql_num_rows()是什么意思

    <?php
    $query = "SELECT name FROM prodGroups";
    $result = mysql_query($query);
    
    if( (!$result) || (mysql_num_rows($result) == 0) )// IF NO PRODUCT GROUPS EXIST
    {
        for ($j=1 ; $j<4 ; $j++)
        {
            echo "<li><a href='#'><span>Empty product group " . $j . "</span></a></li>";
        }
    }
    else // FOR WHEN PRODUCT GROUPS DO EXIST
    {
        while($row = mysql_fetch_array($result, MYSQL_ASSOC)) // CYCLE THROUGH PRODUCT GROUPS
        {
            echo "<li class='submenu'><a href='#'><span>" . $row['name'] . "</span></a>";
            $query2 = "SELECT name FROM products WHERE prodGroup='".mysql_real_escape_string($row['name'])."'";
            $result2 = mysql_query($query2);
            if( (!$result2) || (mysql_num_rows($result2)==0) )
            {
                echo "<ul><li><a href='#'><span>No products</span></a></li></ul>";
            }
            else
            {
                echo "<ul>";
                while ($row2 = mysql_fetch_array($result2, MYSQL_ASSOC)) // PLACE PRODUCTS INTO AN ARRAY
                {
                    echo "<li><a href='#'><span>" . $row2['name'] . "</span></a></li>";
                }
                echo "</ul>";
            }
            echo "</li>";
        }
    }
    ?>
    

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签