2012-07-09 100 views
1

我的問題可能有點含糊,因爲我無法弄清楚。緩慢的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 | 
+----------+-----+-----+ 
+2

二話:你爲什麼要使用引用(&)無處不在?如果您向我們提供了查詢中實際結果的一小段內容,這將非常有幫助。無論如何,很難理解你在做什麼。 – 2012-07-09 12:22:24

+0

此外,嘗試使用xdebug分析您的代碼,並讓我們知道您所看到的內容。 – Mahn 2012-07-09 13:10:46

+0

我已經添加了示例輸入/輸出。 我現在不在現場,所以我沒有訪問(完整)數據。當我再次到現場時,我會嘗試讓xdebug繼續。儘管我以前從未使用過它。 來自c + +背景,對於我來說,使用引用作爲「rowpointers」作爲循環遍歷行和列是有意義的。所以插入總是可以對$ row變量發生,這對我在哪個數組或子數組中無關緊要。 否則我不知道該怎麼做。 – 2012-07-09 13:48:28

回答

0

匝把它的所有調用都計數($ branch)。 顯然調用一個函數,不希望引用像count一樣的變量,通過引用變量,導致函數使變量的副本操作。

在我的情況下,數千個元素的數組。這也解釋了爲什麼它的結果與少數(但大分支)是受到最多的。

看到這個線程: Why is calling a function (such as strlen, count etc) on a referenced value so slow?