PHP 配列を Trees に変換するいくつかの例_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:39:29
オリジナル
879 人が閲覧しました

   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コード

* 配列をツリーに変換します

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

);

に変換

*配列(

[1] => 配列([id] => 1

)

[親ID] => 0

[名前] => 名前1

[子] => Array(

[0] => 配列([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 配列内の親と子を確認するためのキー、例では「id」です

* @param string $parentKey 配列内の親キー、この例では「parentId」です

* @param type $childrenKey ツリーノードの子ノードにインデックスを付けるキー、例では「children」

* @return 配列は生成されたツリーを返します

*/

Phpコード
代码如下
関数 arrayToTree($sourceArr, $key, $parentKey, $childrenKey)
{
    $tempSrcArr = 配列();  
  
    $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)
    {
        $tempSrcArr を返します。  
    }
    その他
    {
        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); }
}



/**再帰的メソッド: **/

$rows = array(

0 => array('id' => 1, 'name' => 'メニュー 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'));

コードは次のとおりです /** * 配列は親 ID に基づいてツリーを生成します
* @staticvar int $ Depth 再帰の深さ
* @param array $data 配列データ
* @param integer 親 ID の $pid 値
* @param string $key id $data 配列内のキーの値
* @param string $chrildKey 生成される子のキー値
* @param string $pKey $data 配列内の親 ID のキー値
* @param int $maxDepth 無限再帰を防ぐための最大再帰深さ
* @return array 再編成された配列
​*/
function getTree($data, $pid = 0, $key = 'id', $pKey = 'parentId', $childKey = 'child', $maxDepth = 0){
静的 $ Depth = 0; $深さ++
If (intval($maxDepth) {
$maxDepth = カウント($data) * カウント($data); }
If ($ Depth > $maxDepth)
{
exit("エラー再帰:最大再帰深さ {$maxDepth}"); }
$tree = 配列(); foreach ($data as $rk => $rv)
{
If ($rv[$pKey] == $pid)
                                                                       $rv[$childKey] = getTree($data, $rv[$key], $key, $pKey, $childKey, $maxDepth); $tree[] = $rv; }
}
$tree を返します。 }



一例

代码如下 复制幣



<頭>


ツリー