Several examples of converting php arrays into trees_PHP tutorial

WBOY
Release: 2016-07-13 10:39:29
Original
879 people have browsed it

   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 code

 * Convert array to tree

 * Example: 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')

 );convert to

* 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 The array to be converted

* @param string $key The key to confirm the parent and child in the array, in the example it is "id"

* @param string $parentKey The parent key in the array, in the example is "parentId"

* @param type $childrenKey The key to index the child node on the tree node, in the example "children"

 * @return array Returns the generated tree

 */

Php code
 代码如下  
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);
}  
}



 /**Recursive method:**/

 $rows = array(

 0 => array('id' => 1, 'name' => 'Menu 1', 'parentId' => 0)

 , 1 => array('id' => 2, 'name' => 'Menu 2', 'parentId' => 0)

 , 2 => array('id' => 3, 'name' => 'Menu 3', 'parentId' => 0)

 , 3 => array('id' => 4, 'name' => 'Menu 1_1', 'parentId' => 1)

 , 4 => array('id' => 5, 'name' => 'Menu 1_2', 'parentId' => 1)

 , 5 => array('id' => 6, 'name' => 'Menu 2_1', 'parentId' => 2)

 );

print_r(getTree($rows, 0, 'id', 'parentId'));

The code is as follows

 代码如下  
  
/** 
 * 数组根据父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;  
/** * The array generates a tree based on the parent id * @staticvar int $depth recursion depth * @param array $data array data * @param integer $pid value of parent id * @param string $key id The key value in the $data array * @param string $chrildKey The key value of the child to be generated * @param string $pKey The key value of the parent id in the $data array * @param int $maxDepth Maximum recursion depth to prevent infinite recursion * @return array The reorganized 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; }

An example

 代码如下 复制代码






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 '
';

?>

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/730238.htmlTechArticlePhp代码 代码如下 * $sourceArr 原来的数组 * $key 主键 * $parentKey 与主键关联的父主键 * $childrenKey 生成的孩子的键名 * */ function arrayToTree($source...
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!