この記事では、PHP Infinitus 分類関数の実装方法を主に紹介し、PHP で Infinitus 分類を実装するための具体的なアイデア、実装コード、および関連する注意事項をサンプルの形で詳しく分析します。この記事では、PHP で無限分類関数を実装する方法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです。
プログラムを開発するとき、すべての列 (第 1 レベルの列、第 2 レベルの列、第 3 レベルの列などを含む) とフォームを取得する必要がある場合があります。親子関係構造に従ったツリー。再帰または参照を使用できます (php の参照は C または C++ のポインターに似ていますが、別の言い方をしただけです)。
参照による無限分類の実現アイデア:
1. つまり、処理されるすべてのデータは、主キー ID (pk) で添え字が付いた配列にパッケージ化され、pid を使用して取得できるようになります。対応する親列。
2. ラップされたデータをループし、それがルート ノードの場合はその参照をツリーに追加し、それ以外の場合はその参照を親クラスの子要素に追加します。このように、ルート ノードのみがツリーに追加されますが、各ルート ノードに子要素がある場合は、子要素への参照が含まれます。したがって、樹形を形成することができます。
コードは次のとおりです
/** * 把返回的数据集转换成Tree * @param array $list 要转换的数据集 * @param string $pk 自增字段(栏目id) * @param string $pid parent标记字段 * @return array * @author dqs <1696232133@qq.com> */ function make_tree($list,$pk='id',$pid='pid',$child='_child',$root=0){ $tree=array(); $packData=array(); foreach ($list as $data) { $packData[$data[$pk]] = $data; } foreach ($packData as $key =>$val){ if($val[$pid]==$root){//代表跟节点 $tree[]=& $packData[$key]; }else{ //找到其父类 $packData[$val[$pid]][$child][]=& $packData[$key]; } } return $tree; }
データ構造は次のとおりです:
実行結果は次のとおりです
Array ( [0] => Array ( [id] => 6 [pid] => 0 [title] => 测试1 [url] => test1 [sort] => 0 [create_time] => 1464076199 [update_time] => 1464076199 [status] => 1 [target] => 0 ) [1] => Array ( [id] => 7 [pid] => 0 [title] => 测试2 [url] => test2 [sort] => 0 [create_time] => 1464076218 [update_time] => 1464076218 [status] => 1 [target] => 0 ) [2] => Array ( [id] => 1 [pid] => 0 [title] => 首页 [url] => Index/index [sort] => 1 [create_time] => 1379475111 [update_time] => 1379923177 [status] => 1 [target] => 0 ) [3] => Array ( [id] => 2 [pid] => 0 [title] => 博客 [url] => Article/index?category=blog [sort] => 2 [create_time] => 1379475131 [update_time] => 1379483713 [status] => 1 [target] => 0 [_child] => Array ( [0] => Array ( [id] => 4 [pid] => 2 [title] => 个人博客 [url] => ownblog [sort] => 0 [create_time] => 1464075558 [update_time] => 1464075558 [status] => 1 [target] => 0 [_child] => Array ( [0] => Array ( [id] => 8 [pid] => 4 [title] => 新浪博客 [url] => sinaBlog [sort] => 0 [create_time] => 1464077276 [update_time] => 1464077276 [status] => 1 [target] => 0 ) ) ) [1] => Array ( [id] => 5 [pid] => 2 [title] => 他人博客 [url] => otherBlog [sort] => 0 [create_time] => 1464075582 [update_time] => 1464075582 [status] => 1 [target] => 0 ) ) ) [4] => Array ( [id] => 3 [pid] => 0 [title] => 官网 [url] => http://www.onethink.cn [sort] => 3 [create_time] => 1379475154 [update_time] => 1387163458 [status] => 1 [target] => 0 ) )
/** * 把返回的数据集转换成Tree * @param array $list 要转换的数据集 * @param string $pid parent标记字段 * @param string $level level标记字段 * @return array * @author 麦当苗儿 <zuojiazi@vip.qq.com> */ function list_to_tree($list, $pk='id', $pid = 'pid', $child = '_child', $root = 0) { // 创建Tree $tree = array(); if(is_array($list)) { // 创建基于主键的数组引用 $refer = array(); foreach ($list as $key => $data) { $refer[$data[$pk]] =& $list[$key]; } foreach ($list as $key => $data) { // 判断是否存在parent $parentId = $data[$pid]; if ($root == $parentId) { $tree[] =& $list[$key]; }else{ if (isset($refer[$parentId])) { $parent =& $refer[$parentId]; $parent[$child][] =& $list[$key]; } } } } return $tree; }
アイデア:
1. ループを使用してすべてのルート ノードをそれぞれ取得します。
2. 各ノードを取得するときは、元のデータからノードを削除し、元のデータが空になるまですべての子ノードを再帰的に取得します。
コードは次のように実装されています:
function make_tree1($list,$pk='id',$pid='pid',$child='_child',$root=0){ $tree=array(); foreach($list as $key=> $val){ if($val[$pid]==$root){ //获取当前$pid所有子类 unset($list[$key]); if(! empty($list)){ $child=make_tree1($list,$pk,$pid,$child,$val[$pk]); if(!empty($child)){ $val['_child']=$child; } } $tree[]=$val; } } return $tree; }
効果のスクリーンショットは次のとおりです:
上記はこの記事の全内容です。皆様のお役に立てば幸いです。勉強。
関連する推奨事項:
PHP Judge FORM データかどうかの確認方法フォームまたは URL パラメータからのパラメータは integer_php のヒント
以上がPHPで無限分類関数を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。