您现在的位置: 万盛学电脑网 >> 程序编程 >> 网络编程 >> php编程 >> 正文

php数组转换成树的几个例子

作者:佚名    责任编辑:admin    更新时间:2022-06-22

   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]]);  
         &nb