2017-05-31 165 views
3

我在頁面上有類別(表示爲複選框)。在下一頁我有第一頁的分類子類。在第二頁中的元素的下一頁子類別等等。我將所有選擇的項目保存在代表在不同級別進行選擇的數組中。問題是我不知道如何從所有這些數組中構建樹結構。讓我說我現在有什麼:PHP從4個陣列構建樹型結構陣列

我有4個數組,讓我們想象他們爲4個級別(每個級別代表複選框在#頁面上選擇)。我在其中保留用戶選擇的複選框。下面是數據的一個例子:(該值代表項目的ID在數據庫中)

The l1 value of $_SESSION['0'] is '1' 

The l2 value of $_SESSION['0'] is '2' 
The l2 value of $_SESSION['1'] is '3' 

The l3 value of $_SESSION['0'] is '3' 
The l3 value of $_SESSION['1'] is '4' 
The l3 value of $_SESSION['2'] is '5' 
The l3 value of $_SESSION['3'] is '6' 

The l4 value of $_SESSION['0'] is '1' 
The l4 value of $_SESSION['1'] is '2' 
The l4 value of $_SESSION['2'] is '3' 
The l4 value of $_SESSION['3'] is '4' 
The l4 value of $_SESSION['4'] is '5' 

對於數據庫中的每個ID我有項的ID是屬於(用於例如:2級: )

id=1; name = programming, category_id = 1; 

我可以通過查詢數據庫找到關係。

在上述情況下,來自l2的兩個元素都是l1 [0]的子類別。 來自等級3的前2個元素是l2 [0]的子類別,後2個元素是l2 [1]的子類別,並且在級別4中,其中一些是3級中的smth的子類別(並非每個元素都可能具有子類別)。

如何爲所有這些數據構建樹狀結構的JSON?任何想法或建議?謝謝!

+0

這個問題與JSON無關。你想在本地PHP數據結構(數組,對象)中創建你的「樹結構」,然後如果你想要一個JSON版本,把它序列化爲'json_encode'。 – JAAulde

+0

O知道,但問題是,我不知道如何做樹結構 –

+0

我明白這一點。我的觀點是你一直在談論JSON,並將問題標記爲JSON。如果你想得到很好的幫助,請將你的問題集中在真正的問題上。 – JAAulde

回答

1

首先,如果我不明白你的問題,請道歉。

讓我解釋一下你的問題,我的理解是:

第一頁

你顯示它包含複選框名爲「類別」形式和值是特定的主要類別的IDS

在第二頁着陸

您填充數組(我會稱之爲$ _SESSION [ 'categories_checked'] )與檢查類別

在第二頁

您顯示1級你顯示主頁上的類別以同樣的方式的子類別。比方說,表單元素名稱是「subcat1」

在第三頁的目標

您填充數組與檢查小類

在第三(我想$ _SESSION [「subcats1_checked」]稱呼它)頁面

顯示級別2的子類別與在主頁面上顯示類別的方式相同。比方說,表單元素名稱是檢查小類

在第四個「subcat2」

在第四頁着陸

您填充數組(我會稱之爲$ _SESSION [「subcats2_checked」])頁面

顯示級別3的子類別與在主頁面上顯示類別的方式相同。比方說,表單元素名稱是檢查子類別 「subcat3」

在最後一頁上着陸

您填充數組(我會稱之爲$ _SESSION [ 'subcats3_checked'])

我回答

從我的角度來看,我寧願做到以下幾點:

  • 總是使用相同的變量名(以HTML形式和PHP),這樣的代碼可以大大提高
  • optionnaly使用,其中將包括水平
  • 巢您的數組一個隱藏的表單元素

    $_SESSION['categories'] = [ 
         3 => [ 
          56 => [ 
           89 => [ 
             121 => [1,2,3,4,5,], 
             ], 
            ], 
          ], 
    ]; 
    

這種表示似乎更接近現實,應該更容易顯示。

下一步是創建一個遞歸函數,您將在該函數處傳遞一個單步形式的結果數組和$ _SESSION ['categories']變量。

讓我知道如果解決方案是適合您的方式......如果需要,我可以幫助您。

所以,遞歸是成功的關鍵,但...

有遺漏......爲了治療你的結果,並有PHP數組我mentionned,你將有來構建你的形式的方式:

第一頁

<input type="checkbox" name="category[0]" value="1" /> Cat1 name 
<input type="checkbox" name="category[0]" value="2" /> Cat2 name 

第二頁

Subcats of cat 1 
<input type="checkbox" name="category[1]" value="110" /> SubCat1 name 
<input type="checkbox" name="category[1]" value="222" /> SubCat2 name 

Subcats of cat 2 
<input type="checkbox" name="category[2]" value="110" /> SubCat1 name 
<input type="checkbox" name="category[2]" value="222" /> SubCat2 name 

這樣,您將能夠避免級別輸入元素,因爲子類別現在僅由其父級定義。 當然,這意味着每個類別和子類別都有不同的ID(如果不是這種情況,技巧是可能的)。

這裏是一個快速和骯髒的代碼應該幫助你

<?php 
/** 
* Created by PhpStorm. 
* User: dvienne 
* Date: 31/05/2017 
* Time: 15:16 
*/ 
function treatCategories($parentCatId, $selectedId, $categories) { 
    foreach($categories as $categoryID => $category) { 
    if(empty($category) AND ($categoryID==$parentCatId)) { 
     $categories[$categoryID][$selectedId] = []; 
     break; 
    } elseif(is_array($category) AND empty($category)) { 
     /** RECURSION */ 
     treatCategories($parentCatId, $selectedId, $category); 
    } 
    } 

    $_SESSION['categories'] = $categories; 
} 


$userSelection = $_POST['categories']; 
$level   = $_POST['level']; 
if(!empty($_SESSION['categories'])) { 
    $categories = $_SESSION['categories']; 
} else { 
    $categories = []; 
} 

if(!empty($categories)) { 
    foreach($userSelection as $parentCatId => $selectedId) { 
    treatCategories($parentCatId, $selectedId, $categories); 
    } 
} else { 
    foreach($userSelection as $catId) { 
    $categories[$catId] = []; 
    } 

    $_SESSION['categories'] = $categories; 
} 

請注意

這顯然是不以治療數據,因爲腳本會掃描整個一個優化的方式插入其值之前的類別數組。 您應該考慮使用AJAX查詢的單頁解決方案。

+0

你明白一切正確!我知道我必須編寫一個遞歸函數,但我不知道該怎麼做。我可能不得不建立多達30或40個陣列。我看不到任何解決這個問題的最佳方法 –

+0

我不知道從哪裏開始。爲了更清楚一點,在表4的數據庫中,我將relationship_id設置爲3級 –