我的問題可能有點含糊,因爲我無法弄清楚。緩慢的php數組處理
我有一塊PHP試圖將mysql查詢結果轉換爲數組「樹」。 也就是說數組的數組取決於定義的組。
該代碼假定列名以雙下劃線__開頭以指示分組,並且結果已經按分組排序。
該代碼有效,但在某些情況下,速度會降低到無法使用的速度。 我期望它快速的情況。每個分支中只有一個分組只有幾個唯一值和多個項目,有時需要長達30秒。 其他情況下,有許多分支層次和許多不同的值,只需要1秒。 (結果集通常在20000行左右)
所以,我的問題我猜是簡單的,我的代碼有什麼問題?在哪裏搞糟如此糟糕,以至於會顯着影響性能。
P.S.我是一個相對的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 「:[{」 隱藏 「:」 2" , 「UTD」: 「0」},{ 「隱藏」: 「4」, 「UTD」: 「0」},{ 「隱藏」: 「5」,」 UTD 「:」 0 「},{」 隱藏 「:」 1" , 「UTD」: 「0」}]}]
生成此結果的實際SQL的結果是:
+----------+-----+-----+
| __av | hid | utd |
+----------+-----+-----+
| eset nod | 3 | 1 |
| None | 2 | 0 |
| None | 4 | 0 |
| None | 5 | 0 |
| None | 1 | 0 |
+----------+-----+-----+
二話:你爲什麼要使用引用(&)無處不在?如果您向我們提供了查詢中實際結果的一小段內容,這將非常有幫助。無論如何,很難理解你在做什麼。 – 2012-07-09 12:22:24
此外,嘗試使用xdebug分析您的代碼,並讓我們知道您所看到的內容。 – Mahn 2012-07-09 13:10:46
我已經添加了示例輸入/輸出。 我現在不在現場,所以我沒有訪問(完整)數據。當我再次到現場時,我會嘗試讓xdebug繼續。儘管我以前從未使用過它。 來自c + +背景,對於我來說,使用引用作爲「rowpointers」作爲循環遍歷行和列是有意義的。所以插入總是可以對$ row變量發生,這對我在哪個數組或子數組中無關緊要。 否則我不知道該怎麼做。 – 2012-07-09 13:48:28