Php代碼
| 代碼如下 |
|
* $sourceArr 原來的數組 * $key 主鍵 * $parentKey 與主鍵關聯的父主鍵 * $childrenKey 產生的孩子的鍵名 * */ function arrayToTree($sourceArr, $key, $parentKey, $childrenKey) { $tempSrcArr = array(); foreach ($sourceArr as $v) { $tempSrcArr[$v[$key]] = $v; } $i = 0; $count = count($sourceArr); for($i = ($count - 1); $i >=0; $i--) { if (isset($tempSrcArr[$sourceArr[$i][$parentKey]])) { $tArr = array_pop($tempSrcArr); $tempSrcArr[$tArr[$parentKey]][$childrenKey] = (isset($tempSrcArr[$tArr[$parentKey]][$childrenKey]) && is_array($tempSrcArr[$tArr[$parentKey]][$childrenKey])) ? $tempSrcArr[$tArr[$parentKey]][$childrenKey] : array(); array_push ($tempSrcArr[$tArr[$parentKey]][$childrenKey], $tArr); } } return $tempSrcArr; } |
Php代碼
* 將數群組轉換成樹
* 例子:將 array(
array('id'=>1,'parentId' => 0,'name'=> 'name1')
,array('id'=>2,'parentId' => 0,'name'=> 'name2')
,array('id'=>4,'parentId' => 1,'name'=> 'name1_4')
,array('id'=>15,'parentId' => 1,'name'=> 'name1_5')
);轉換成
* Array(
[1] => Array([id] => 1
[parentId] => 0
[name] => name1
[children] => Array(
[0] => Array([id] => 15,[parentId] => 1,[name] => name1_5)
[1] => Array([id] => 4,[parentId] => 1,[name] => name1_4)
)
)
[2] => Array([id] => 2,[parentId] => 0,[name] => name2)
)
* @param array $sourceArr 要轉換的數組
* @param string $key 數組中確認父子的key,例子中為“id”
* @param string $parentKey 數組中父key,例子中為“parentId”
* @param type $childrenKey 要在樹節點上索引子節點的key,例子中為“children”
* @return array 返回產生的樹
*/
| 代碼如下 |
|
function arrayToTree($sourceArr, $key, $parentKey, $childrenKey) { $tempSrcArr = array(); $allRoot = TRUE; foreach ($sourceArr as $v) { $isLeaf = TRUE; foreach ($sourceArr as $cv ) { if (($v[$key]) != $cv[$key]) { if ($v[$key] == $cv[$parentKey]) { $isLeaf = FALSE; } if ($v[$parentKey] == $cv[$key]) { $allRoot = FALSE; } } } if ($isLeaf) { $leafArr[$v[$key]] = $v; } $tempSrcArr[$v[$key]] = $v; } if ($allRoot) { return $tempSrcArr; } else { unset($v, $cv, $sourceArr, $isLeaf); foreach ($leafArr as $v) { if (isset($tempSrcArr[$v[$parentKey]])) { $tempSrcArr[$v[$parentKey]][$childrenKey] = (isset($tempSrcArr[$v[$parentKey]][$childrenKey]) && is_array($tempSrcArr[$v[$parentKey]][$childrenKey])) ? $tempSrcArr[$v[$parentKey]][$childrenKey] : array(); array_push ($tempSrcArr[$v[$parentKey]][$childrenKey], $v); unset($tempSrcArr[$v[$key]]); } } unset($v); return arrayToTree($tempSrcArr, $key, $parentKey, $childrenKey); } } |
Php代碼
/**遞迴方法:**/
$rows = array(
0 => array('id' => 1, 'name' => '菜單1', 'parentId' => 0)
, 1 => array('id' => 2, 'name' => '菜單2', 'parentId' => 0)
, 2 => array('id' => 3, 'name' => '菜單3', 'parentId' => 0)
, 3 => array('id' => 4, 'name' => '菜單1_1', 'parentId' => 1)
, 4 => array('id' => 5, 'name' => '菜單1_2', 'parentId' => 1)
, 5 => array('id' => 6, 'name' => '菜單2_1', 'parentId' => 2)
);
print_r(getTree($rows, 0, 'id', 'parentId'));
| 代碼如下 |
|
/** * 數組根據父id產生樹 * @staticvar int $depth 遞迴深度 * @param array $data 數組資料 * @param integer $pid 父id的值 * @param string $key id在$data數組中的索引值 * @param string $chrildKey 要產生的子的索引值 * @param string $pKey 父id在$data數組中的索引值 * @param int $maxDepth 最大遞迴深度,防止無限遞迴 * @return array 重組後的數組 */ function getTree($data, $pid = 0, $key = 'id', $pKey = 'parentId', $childKey = 'child', $maxDepth = 0){ static $depth = 0; $depth++; if (intval($maxDepth) <= 0) { $maxDepth = count($data) * count($data); } if ($depth > $maxDepth) { exit("error recursion:max recursion depth {$maxDepth}"); } $tree = array(); foreach ($data as $rk => $rv) { if ($rv[$pKey] == $pid) { $rv[$childKey] = getTree($data, $rv[$key], $key, $pKey, $childKey, $maxDepth); $tree[] = $rv; } } return $tree; } |
一個執行個體
| 代碼如下 |
複製代碼 |
| TREE // 樹組的順序即是分類的順序,因此前當分類的下級子類一定要緊隨其後 $tree= array( 1 => array('id'=>1, 'cname'=>'一級分類', 'pid'=>0), 100 => array('id'=>100, 'cname'=>'特意加進去的二級分類', 'pid'=>1), 101 => array('id'=>101, 'cname'=>'特意加進去的二級分類2222222222', 'pid'=>1), 2 => array('id'=>2, 'cname'=>'二級分類', 'pid'=>1), 3 => array('id'=>3, 'cname'=>'三級分類', 'pid'=>2), 4 => array('id'=>4, 'cname'=>'四級分類', 'pid'=>3), 5 => array('id'=>5, 'cname'=>'四級分類2', 'pid'=>3), 200 => array('id'=>200, 'cname'=>'55555', 'pid'=>5), 6 => array('id'=>6, 'cname'=>'另一級分類', 'pid'=>0), 7 => array('id'=>7, 'cname'=>'First First First', 'pid'=>0), 8 => array('id'=>8, 'cname'=>'First First First', 'pid'=>7), ); // 指定分類ID,返回子類量(不進行深度遞迴) function getChildTotal($id) { global $tree; $total = 0; foreach($tree as $value) { if ($id == $value['pid']) { $total++; } } return $total; } // 指定分類ID,www.111cn.net並返回數組(不進行深度遞迴) function getChildArray($id) { global $tree; $array = array(); foreach($tree as $key=>$value) { if ($id == $value['pid']) { $array[$key] = $value; } } return $array; } // 遞迴查詢方式將樹數群組轉換成HTML嵌套樹 function getTreeHTML($tree,$level = 0) { if ($tree) { $level += 1; foreach($tree as $id => $node) { $html .= "
";
$html .= '
-
'.$node['cname']."
";
if (getChildTotal($node['id']))
{
$tree_last = getChildArray($node['id']);
$html .= '
-
';
$html .= getTreeHTML($tree_last,$level);
$html .= '
';
} $html .= '
'; } } return $html; } $html = getTreeHTML( getChildArray(0) ); echo ''; echo $html; echo ''; ?> |
http://www.bkjia.com/PHPjc/730238.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/730238.htmlTechArticlePhp代碼 代碼如下 * $sourceArr 原來的數組 * $key 主鍵 * $parentKey 與主鍵關聯的父主鍵 * $childrenKey 產生的孩子的鍵名 * */ function arrayToTree($source...