php list 转tree,PHP 数组转树形结构
之前寫過同樣功能的,使用的遞歸,代碼丑陋不堪,偶然發現寫的非常好的實現,摘抄如下:
直接上代碼
/**
* 把返回的數據集轉換成Tree
* @param array $list 要轉換的數據集
* @param string $pid parent標記字段
* @param string $level level標記字段
* @return array
*/
function List2Tree($list, $pk='id', $pid = 'pid', $child = '_child', $root = 0) {
if (!is_array($list)) {
return [];
}
// 創建基于主鍵的數組引用
$aRefer = [];
foreach ($list as $key => $data) {
$aRefer[$data[$pk]] = & $list[$key];
}
foreach ($list as $key => $data) {
// 判斷是否存在parent
$parentId = $data[$pid];
if ($root === $parentId) {
$tree[] = & $list[$key];
} else {
if (isset($aRefer[$parentId])) {
$parent = & $aRefer[$parentId];
$parent[$child][] = & $list[$key];
}
}
}
return $tree;
}
/**
* 把返回的數據集轉換成Tree
* @param array $rows 要轉換的數據集
* @param string $id 主鍵id
* @param string $pid parent標記字段
* @param string $child 子節點存放的位置
* @return array
*/
function List2Tree2($rows, $id='id', $pid='pid', $child = 'child') {
$items = array();
foreach ($rows as $row) {
$items[$row[$id]] = $row;
}
foreach ($items as $item) {
$items[$item[$pid]][$child][$item[$id]] = &$items[$item[$id]];
}
return isset($items[0][$child]) ? $items[0][$child] : [];
}
上測試代碼
$aData = [
[
"id" => 1,
"pid" => 0,
"name" => "全部分類",
],
[
"id" => 2,
"pid" => 1,
"name" => "電商",
],
[
"id" => 3,
"pid" => 1,
"name" => "社區",
],
[
"id" => 4,
"pid" => 2,
"name" => "訂單",
],
[
"id" => 5,
"pid" => 2,
"name" => "產品",
],
[
"id" => 6,
"pid" => 4,
"name" => "下單",
],
];
$aRoot = List2Tree($aData, 'id', 'pid', 'child', 0);
echo json_encode($aRoot) . "\n";
echo "##################\n";
$aRoot = List2Tree2($aData);
echo json_encode($aRoot) . "\n";
總結
以上是生活随笔為你收集整理的php list 转tree,PHP 数组转树形结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 5.2 mysqli_PHP5安
- 下一篇: 微信支付通知 php,微信支付开发交易通