我的问题可能有点模糊,因为我不太清楚。
我有一段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等)如此缓慢?