php數群組轉換成樹的幾個例子_PHP教程

來源:互聯網
上載者:User
  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...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.