Maison > Article > développement back-end > PHP无限级分类 代码问题
自己试着写了个无限级分类的,结果有些问题,想了很长时间了,感觉代码没问题呀,可就是结果不正确。现在整个人都懵了....
网上的栗子看了些,貌似写法跟我的不一样。
数组结构如下:
<code>Array ( [0] => Array ( [id] => 1 [name] => 代码 [parent] => 0 ) [1] => Array ( [id] => 3 [name] => 动漫 [parent] => 0 ) [2] => Array ( [id] => 4 [name] => 治愈 [parent] => 3 ) [3] => Array ( [id] => 5 [name] => 励志 [parent] => 3 ) [4] => Array ( [id] => 6 [name] => 机战 [parent] => 3 ) [5] => Array ( [id] => 7 [name] => 百合 [parent] => 3 ) [6] => Array ( [id] => 8 [name] => 资源 [parent] => 0 ) [7] => Array ( [id] => 9 [name] => app [parent] => 8 ) [8] => Array ( [id] => 10 [name] => 软件 [parent] => 8 ) [9] => Array ( [id] => 11 [name] => 黑科技 [parent] => 8 ) )</code>
其中 id
为分类唯一ID, parent
为父类ID
我写的代码 如下:
<code> function all($id=0){ static $_class = null; if(is_null($_class)) $_class = select(); //这个得出来的就是以上的数组结构,然后赋值给了`$_class`变量 $result = array(); foreach($_class as $k => $v){ if($v['parent'] == $id){ unset($_class[$k]); $v = array_merge($v, $this->all($v['id'])); $result['child'][] = $v; } } return $result; } print_r(all(0));</code>
自己试着写了个无限级分类的,结果有些问题,想了很长时间了,感觉代码没问题呀,可就是结果不正确。现在整个人都懵了....
网上的栗子看了些,貌似写法跟我的不一样。
数组结构如下:
<code>Array ( [0] => Array ( [id] => 1 [name] => 代码 [parent] => 0 ) [1] => Array ( [id] => 3 [name] => 动漫 [parent] => 0 ) [2] => Array ( [id] => 4 [name] => 治愈 [parent] => 3 ) [3] => Array ( [id] => 5 [name] => 励志 [parent] => 3 ) [4] => Array ( [id] => 6 [name] => 机战 [parent] => 3 ) [5] => Array ( [id] => 7 [name] => 百合 [parent] => 3 ) [6] => Array ( [id] => 8 [name] => 资源 [parent] => 0 ) [7] => Array ( [id] => 9 [name] => app [parent] => 8 ) [8] => Array ( [id] => 10 [name] => 软件 [parent] => 8 ) [9] => Array ( [id] => 11 [name] => 黑科技 [parent] => 8 ) )</code>
其中 id
为分类唯一ID, parent
为父类ID
我写的代码 如下:
<code> function all($id=0){ static $_class = null; if(is_null($_class)) $_class = select(); //这个得出来的就是以上的数组结构,然后赋值给了`$_class`变量 $result = array(); foreach($_class as $k => $v){ if($v['parent'] == $id){ unset($_class[$k]); $v = array_merge($v, $this->all($v['id'])); $result['child'][] = $v; } } return $result; } print_r(all(0));</code>
unset($_class[$k]);
这一行去掉
鉴于你这个还是用的递归来完成的,我这里提供2个方法,一个是递归的,一个是指针形态的。
第二个可能您暂时无法理解,但是为帮助您学习,以及方便到他人,以下是代码:
<code>// 呃,我真不忍心写出这个循环那么多遍的代码,求神解救我。 function _data_to_tree(&$items, $topid = 0, $with_id = TRUE) { $result = []; foreach($items as $v) if ($topid == $v['parent']) { $r = $v + ['children' => _data_to_tree($items, $v['id'], $with_id)]; if ($with_id) $result[$v['id']] = $r; else $result[] = $r; } return $result; } </code>
<code>function _data_to_tree($items, $topid = 0, $with_id = TRUE) { if ($with_id) foreach ($items as $item) $items[ $item['parent'] ]['children'][ $item['id'] ] = &$items[ $item['id'] ]; else foreach ($items as $item) $items[ $item['parent'] ]['children'][] = &$items[ $item['id'] ]; return isset($items[ $topid ]['children']) ? $items[ $topid ][ 'children' ] : []; }</code>
传入你的上述数组,比如最顶层的ID为0
<code>$data = [ ['id' => 4, 'parent' => 1 , 'text' => 'Parent1'], ['id' => 1, 'parent' => 0 , 'text' => 'Root'], ['id' => 2, 'parent' => 1 , 'text' => 'Parent2'], ['id' => 3, 'parent' => 2 , 'text' => 'Sub1'], ]; print_r ( _data_to_tree($data, 0) ); </code>
<code>Array ( [1] => Array ( [id] => 1 [parent] => 0 [text] => Root [children] => Array ( [4] => Array ( [id] => 4 [parent] => 1 [text] => Parent1 [children] => Array ( ) ) [2] => Array ( [id] => 2 [parent] => 1 [text] => Parent2 [children] => Array ( [3] => Array ( [id] => 3 [parent] => 2 [text] => Sub1 [children] => Array ( ) ) ) ) ) ) )</code>