如何将一个sql查询循环更改为一个数组循环

时间:2010-05-20 20:47:16

标签: php mysql arrays

我记录了我的网站的查询数量,并在页面中运行以下脚本,向页面添加了40个额外的查询。

如何将此sql连接更改为propper并点亮

    function tree_set($index)
    {
        //global $menu; Remove this.
        $q=mysql_query("select id,name,parent from cats where parent='$index'");
        if(mysql_num_rows($q) === 0)
        {
            return;
        }

        // User $tree instead of the $menu global as this way there shouldn't be any data duplication
        $tree = $index > 0 ? '<ul>' : ''; // If we are on index 0 then we don't need the enclosing ul
        while($arr=mysql_fetch_assoc($q))
        {
            $subFileCount=mysql_query("select id,name,parent from cats where parent='{$arr['id']}'");
            if(mysql_num_rows($subFileCount) > 0)
            {
                $class = 'folder';
            }
            else
            {
                $class = 'file';
            }

            $tree .= '<li>';
            $tree .= '<span class="'.$class.'">'.$arr['name'].'</span>';
            $tree .=tree_set("".$arr['id']."");
            $tree .= '</li>'."\n";
        }
        $tree .= $index > 0 ? '</ul>' : ''; // If we are on index 0 then we don't need the enclosing ul

        return $tree;
    }

//variable $menu must be defined before the function call
$menu = '....<ul id="browser" class="filetree">'."\n";
$menu .= tree_set(0);
$menu .= '</ul>';

echo $menu;

我听说,这可以通过将其更改为数组来完成,但我不知道该怎么做

提前致谢

3 个答案:

答案 0 :(得分:2)

试试这个(未经测试的代码):

function tree_set($index)
{
    //global $menu; Remove this.
    $q=mysql_query("select id,name,parent from cats where parent='$index'");
    if(mysql_num_rows($q) === 0)
        return;

    $cats = array();
    $cat_ids = array();

    while($arr=mysql_fetch_assoc($q))
    {
       $id = intval($arr['id']);
       $cats[$id] = $arr;
    }

    $subFilesCountQuery="select parent,count(*) as subFileCount from cats where parent=".
                   join(" OR parent=",array_keys($cats))." GROUP BY parent";

    $subFileCountResult=mysql_query($subFilesCountQuery);

    while($arr=mysql_fetch_assoc($subFileCountResult))
    {
       $id = intval($arr['parent']);
       $cats[$id]['subFileCount'] = $arr['subFileCount'];
    }

    // If we are on index 0 then we don't need the enclosing ul
    $tree = $index > 0 ? '<ul>' : ''; 
    foreach($cats as $id => $cat)
    {
        if($cat['subFileCount'] > 0)
            $class = 'folder';
        else
            $class = 'file';

        $tree .= '<li>';
        $tree .= '<span class="'.$class.'">'.$arr['name'].'</span>';
        $tree .=tree_set("".$arr['id']."");
        $tree .= '</li>'."\n";
    }
    $tree .= $index > 0 ? '</ul>' : '';

我正在做的是两个查询:一个用于获取所有类别(您的原始第一个查询),然后是第二个查询以一次性获取所有子类别计数。我还将所有类别存储在一个可以循环访问的数组中,而不是在从数据库中提取时显示。

答案 1 :(得分:0)

可以通过将数据复制到数组中,然后使用该副本来完成:即

while($arr=mysql_fetch_assoc($q))
    {
        $results[] = $arr;
    }

稍后,您可以在$ results

上执行任何操作

您的代码的主要问题是您将显示逻辑与SQL查询混合在一起。

答案 2 :(得分:-1)

在单个查询中选择整个树,例如“select id,name,parent from cats”。迭代结果,在PHP中构建代表树的数组,然后使用数组作为源

绘制HTML