一段生成無限級別分類的代碼思考
來自專欄 PHP技術大全12 人贊了文章
Talk is cheap,show me the code.
筆者也不爽約,先丟上代碼:
<?php$areas = array( 1 => array(id => 1, pid => 0, name => 江西省), 2 => array(id => 2, pid => 0, name => 黑龍江省), 3 => array(id => 3, pid => 1, name => 南昌市), 4 => array(id => 4, pid => 2, name => 哈爾濱市), 5 => array(id => 5, pid => 2, name => 雞西市), 6 => array(id => 6, pid => 4, name => 香坊區), 7 => array(id => 7, pid => 4, name => 南崗區), 8 => array(id => 8, pid => 6, name => 和興路), 9 => array(id => 9, pid => 7, name => 西大直街), 10 => array(id => 10, pid => 8, name => 東北林業大學), 11 => array(id => 11, pid => 9, name => 哈爾濱工業大學), 12 => array(id => 12, pid => 8, name => 哈爾濱師範大學), 13 => array(id => 13, pid => 1, name => 贛州市), 14 => array(id => 14, pid => 13, name => 贛縣), 15 => array(id => 15, pid => 13, name => 于都縣), 16 => array(id => 16, pid => 14, name => 茅店鎮), 17 => array(id => 17, pid => 14, name => 大田鄉), 18 => array(id => 18, pid => 16, name => 義源村), 19 => array(id => 19, pid => 16, name => 上壩村),);function makeTree($areas){ $areaTree = []; foreach ($areas as $id=>$area){ if(isset($areas[$area["pid"]])){ $areas[$area["pid"]]["children"][] = &$areas[$id]; } else { $areaTree[] = &$areas[$id]; } } return $areaTree;}echo json_encode(makeTree($areas));
結果如下:
上圖未展示全部內容。
我們可以看到,原本比較複雜無限極別的分類樹狀結構的類目被輕易實現了,我想很多小夥伴還不知道是原理是幾何,下面我們對上面的代碼片段進行分析。
首先是我們的區域數據$areas,數組的鍵必須跟元素的id鍵對應值相等,pid表示父元素的對應的鍵,當元素pid等於0時則表示它本身是最頂層的元素,這個數據比較像省市縣等多級分類的樹狀結構的數據,有些同學可能要問了,什麼是樹狀結構,為了比較形象地說明這個結構我盜用下面這張圖:
其次是,makeTree函數裡面的演算法用到了PHP的&引用符號,這裡主要在於利用引用可以將對元素後續的修改操作影響到之前已有的元素,這也是引用的魔力所在,這裡的理解可能有點繞,需要同學們自己好好理解一下PHP引用的原理和用法才行,官方文檔:http://www.php.net/manual/zh/language.references.pass.php。
另外,需要注意的是當我們想要分類按照一定的順序排列的時候,最好能夠加上一個sort欄位,根據sort的值降序排列分類項即可,若sort的值是一樣的,則按照元素的id降序,這樣就能保持一致的分類樹輸出了。
拓展一下,我們藉助zTree,就可以輕鬆實現我們需要的樹狀結構了,不過通過zTree這個js插件,我們甚至不需要在後端進行makeTree的預處理。
推薦閱讀:
※Web開發中,什麼級別才算是高並發
※php 執行mysql中查詢時內存溢出怎麼辦?
※php開發常用函數總結
※很棒棒少年團介紹
※大數據告訴你,該不該學習PHP?
TAG:PHP |