php数组处理缓慢


Slow php array processing

我的问题可能有点模糊,因为我不太清楚。

我有一段PHP,它试图将mysql查询结果转换为数组"树"。即取决于定义的组的数组。

该代码假设列名将以双下划线__开头以表示分组,并且结果将已按分组排序。

代码是有效的,但在某些情况下会减慢到无法使用的速度。我希望它会很快。只有一个分组,每个分支中只有几个唯一的值和许多项目,有时需要长达30秒的时间。在其他具有许多分支层和许多不同值的情况下,只需要1秒。(结果集通常在20000行左右)

所以,我想我的问题很简单,我的代码出了什么问题?我哪里搞砸了,会对性能产生重大影响。

附言:我是一个相对的php新手,所以要温和:)

抱歉,没有代码注释O_O

$encodable = array();
$rownum = 0;
$branch = null;
$row = null;
$first = true;
$NULL = null;
$result = mysql_query($value,$mysql);
error_log (date("F j, Y, g:i a")."'r'n",3,"debug.log");
if (gettype($result) == "resource")
{
    while($obj = mysql_fetch_object($result))
    {
        $newrow = true;
        $branch = &$encodable;
        $row = &$NULL;
        if (count($branch) > 0)
        {
            $row = &$branch[count($branch)-1];
        }
        foreach ($obj as $column => $value)
        {
            if ($column[0] == '_' && $column[1] == '_')
            {
                $gname = substr($column,2);
                if (isset($row[$gname]) && $row[$gname] == $value)
                {
                    $branch = &$row["b"];
                    $row = &$NULL;
                    if (count($branch) > 0)
                    {
                        $row = &$branch[count($branch)-1];
                    }
                }
                else
                {
                    $branch[] = array();
                    $row = &$branch[count($branch)-1];
                    $row[$gname] = $value;
                    $row["b"] = array();
                    $branch = &$row["b"];
                    $row = &$NULL;
                    if (count($branch) > 0)
                    {
                        $row = &$branch[count($branch)-1];
                    }
                }
            }
            else
            {
                if ($newrow)
                {
                    $branch[] = array();
                    $row = &$branch[count($branch)-1];
                    $newrow = false;
                }
                $row[$column] = $value;
            }
        }
        $rownum++;
    }
}
$encoded = json_encode($encodable);

编辑:一个示例输出-生成的数组被转换为json。这个小集合按"av"分组,b由每个分支的代码创建,然后包含每个av的[hid,utd]记录列表。

[{"av":"eset-nod","b":[{

产生这个结果的实际sql结果是:

 +----------+-----+-----+
 | __av     | hid | utd |
 +----------+-----+-----+
 | eset nod |   3 |   1 |
 | None     |   2 |   0 |
 | None     |   4 |   0 |
 | None     |   5 |   0 |
 | None     |   1 |   0 |
 +----------+-----+-----+

找出所有要计数的调用($branch)。显然,调用一个函数时不需要像count这样的引用变量,通过引用变量,会导致函数复制要操作的变量。

在我的例子中,数组包含数千个元素。这也解释了为什么它的结果很少(但分支很大)是受影响最大的结果。

请参阅此线程:为什么对引用值调用函数(如strlen、count等)如此缓慢?