1

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

我有一段 PHP 尝试将 mysql 查询结果转换为数组“树”。即取决于定义的组的数组数组。

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

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

所以,我想我的问题很简单,我的代码有什么问题?哪里搞砸了,以至于会严重影响性能。

PS我是一个相对的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":[{"hid":"3","utd":"1"}]},{"av":"None","b":[ {"hid":"2","utd":"0"},{"hid":"4","utd":"0"},{"hid":"5","utd":" 0"},{"hid":"1","utd":"0"}]}]

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

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

1 回答 1

0

结果是所有对 count($branch) 的调用。显然调用一个函数,它不期望像 count 这样的引用变量,使用引用变量,会导致函数复制要操作的变量。

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

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

于 2012-07-10T12:11:48.573 回答