この記事では、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 Infinitus分類機能の実装方法例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。