簡體   English   中英

在PHP中從MySQL表創建多維數組樹

[英]Creating a multidimensional array tree from MySQL table in PHP

我試圖將我的mysql表組織成一個多維php樹數組。

例如,我正在嘗試將我的產品按層次結構進行組織,以便於選擇,以縮小結果范圍。

我返回了這樣的mysql行:

Array
(
    [1] => Amazon
    [2] => Kindle Fire
    [3] => 
    [4] => 
    [5] => 
    [6] => 
    [7] => 
    [8] => 
    [9] => 1
)
Array
(
    [1] => Amazon
    [2] => Kindle Fire HD
    [3] => WiFi
    [4] => 7"
    [5] => 
    [6] => 16GB
    [7] => 
    [8] => 
    [9] => 2
)
Array
(
    [1] => Amazon
    [2] => Kindle Fire HD
    [3] => WiFi
    [4] => 7"
    [5] => 
    [6] => 32GB
    [7] => 
    [8] => 
    [9] => 3
)
Array
(
    [1] => Amazon
    [2] => Kindle Fire HD
    [3] => WiFi
    [4] => 8.9"
    [5] => 
    [6] => 16GB
    [7] => 
    [8] => 
    [9] => 4
)
Array
(
    [1] => Amazon
    [2] => Kindle Fire HD
    [3] => WiFi
    [4] => 8.9"
    [5] => 
    [6] => 32GB
    [7] => 
    [8] => 
    [9] => 5
)
Array
(
    [1] => Amazon
    [2] => Kindle Fire HD
    [3] => 4G LTE
    [4] => 8.9"
    [5] => 
    [6] => 32GB
    [7] => 
    [8] => 
    [9] => 6
)
Array
(
    [1] => Amazon
    [2] => Kindle Fire HD
    [3] => 4G LTE
    [4] => 8.9"
    [5] => 
    [6] => 64GB
    [7] => 
    [8] => 
    [9] => 7
)
Array
(
    [1] => Amazon
    [2] => Kindle Fire HDX
    [3] => Wifi
    [4] => 7"
    [5] => 
    [6] => 16GB
    [7] => 
    [8] => 
    [9] => 8
)
Array
(
    [1] => Amazon
    [2] => Kindle Fire HDX
    [3] => Wifi
    [4] => 7"
    [5] => 
    [6] => 32GB
    [7] => 
    [8] => 
    [9] => 9
)
Array
(
    [1] => Amazon
    [2] => Kindle Fire HDX
    [3] => Wifi
    [4] => 7"
    [5] => 
    [6] => 64GB
    [7] => 
    [8] => 
    [9] => 10
)

...等等

請注意,最后一個數組值是產品ID。

我正在尋找編寫遞歸函數的幫助,該遞歸函數將導致數組如下所示:

Array(
    'Amazon' => Array(
         'Kindle Fire' => 1,
         'Kindle Fire HD' => Array(
              'WiFi' => Array(
                  '7"' => Array(
                      '16GB' => 2,
                      '32GB' => 3
                  )
                  '8.9"' => Array(
                      '16GB' => 4,
                      '32GB' => 5
                  )
              )
         )

    )
)

我已經嘗試過類似的東西:

while($row = mysqli_fetch_row($res)) {
    $id = $row[0];
    unset($row[0]);
    unset($row[count($row)]);
        $row[] = $id; // Moves id to last array value

    for($i = 1; $i < count($row); $i++) {
        if($i == 1) {
            if(!array_key_exists($row[$i], $data)) {
                // Insert key
                $data[$row[$i]] = array();
            }
        }
        else {
            $level = $data[$row[$i-1]];

            if(array_key_exists($row[$i], $level)) {
                // Key exists
            }
            else {
                // Insert key

            }
        }
    }
}

我認為您的代碼具有良好的意圖:使用$level保持當前深度。 但是目前這還行不通,因為您是通過$level = $data[$row[$i-1]];復制的$level = $data[$row[$i-1]]; -相反,您需要引用它 ,例如$level =& $data[$row[$i-1]];

$result = array();
while ($row = mysqli_fetch_row($res)) [
    $id = array_shift($row);

    if (!isset($maxIterator))
        $maxIterator = count($row)-1;

    $current =& $result;
    for ($i=0; $i<$maxIterator; $i++) {
        if (empty($row[$i]))
            break;
        if (!array_key_exists($row[$i], $current))
            $current[ $row[$i] ] = array();
        $current =& $current[ $row[$i] ];
    }
    //for properly ended and wasn't broken out of sooner
    if ($i == $maxIterator) {
        if (!array_key_exists($row[$i], $current))
            $current[ $row[$i] ] = 1;
        else
            $current[ $row[$i] ]++;
    }
}

array_shift基本上可以做到,您需要兩行來完成:獲取數組的第一個元素,然后將其刪除。 然后,我將計數結果保存在一個變量中,因此不需要在for AND while每次迭代中都重新計算它。

另外我建議手動設置$maxIterator 根據顯示的結果,一個很好的默認值為5 這樣所有值在5號之前。 將用於嵌套,第五位本身將用於計數(在您的示例中,這是存儲空間)。

因為for將在最后一次迭代后執行$i++ (然后它使條件失敗並因此導致循環中斷),因此可以將其用於計數。


我個人會過分考慮您到底在做什么,並且可能為此使用特定的結構。 但是,此代碼應給您一個很好的印象,即如何使用引用來解決它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM