简体   繁体   中英

PHP Array is carrying too many elements

<?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>";
            }
        }
    }

?>

Where $products[] = $row['name'] ; it is carrying ALL the elements, whereas I just want it to carry product names to where they match the prodGroup name? I've tried using unset() to delete array contents in the loop, however this only allows one element in the array per cycle.

Add $products = array(); immediately after:

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

I tried to rewrite your loop, fixing several issues, most of them minor. I commented my changes. See if this works for you.

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

    }

Of course, please do not use the deprecated mysql extension. See comment by @FreshPrinceOfSO.

This should be a little neater for you to see what I meant by using 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>";
    }
}
?>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM