如何将特定结构的数组转换为“树”结构的数组?

时间:2018-10-31 06:59:38

标签: php arrays tree

我想从多维数组创建树形数组。我想创建一个目录结构,所以我需要Tree格式的数组。 根目录是类别名称,其索引为零(0)。 然后将所有子目录放在根目录下。 请帮助我用PHP创建一个树形数组。

给出了我的数组。

$array = array
(
    array(array('category_id'=>1,'parent'=>0,'category'=>'General')),
    array(
        array('category_id'=>5,'parent'=>4,'category'=>'sds'),
        array('category_id'=>4,'parent'=>1,'category'=>'ssaas'),
        array('category_id'=>1,'parent'=>0,'category'=>'General'),
    ),
    array(array('category_id'=>3,'parent'=>0,'category'=>'SOP')),
    array(
        array('category_id'=>4,'parent'=>1,'category'=>'ssaas'),
        array('category_id'=>1,'parent'=>0,'category'=>'General'),
    ),
    array(array('category_id'=>2,'parent'=>0,'category'=>'Test')),
);

结果数组为

$array =    array(
    array(
        'category_id'=>1,
        'parent'=>0,
        'category'=>'General',
        'child' => array(
                'category_id'=>4,
                'parent'=>1,
                'category'=>'ssaas',
                'child' => array(
                            'category_id'=>4,
                            'parent'=>1,
                            'category'=>'sds',
                                ),
    ),
    ),
     array(
            'category_id'=>2,
            'parent'=>0,
            'category'=>'Test',
         ),
     array(
            'category_id'=>3,
            'parent'=>0,
            'category'=>'SOP',
    ),
);

2 个答案:

答案 0 :(得分:0)

$arr = [];
$g_pa = ['name' => 'grandpa'];
$dad = ['name' => 'dad'];
$son = ['name' => 'son']
$another_g_pa = ['name' => 'another_grandpa'];

$dad['child'] = $son;
$g_pa['child'] = $dad;
$arr = [$g_pa, $another_g_pa];

所以,这是阵列中的爷爷,爸爸的孩子是儿子,爸爸是爷爷的孩子。对于短代码,请使用[],而不要使用array()

答案 1 :(得分:0)

您可以扁平化->按父级排序->然后用原始数组制作一棵树:

$array = array
(
    array(array('category_id'=>1,'parent'=>0,'category'=>'General')),
    array(
        array('category_id'=>5,'parent'=>4,'category'=>'sds'),
        array('category_id'=>4,'parent'=>1,'category'=>'ssaas'),
        array('category_id'=>1,'parent'=>0,'category'=>'General'),
    ),
    array(array('category_id'=>3,'parent'=>0,'category'=>'SOP')),
    array(
        array('category_id'=>4,'parent'=>1,'category'=>'ssaas'),
        array('category_id'=>1,'parent'=>0,'category'=>'General'),
    ),
    array(array('category_id'=>2,'parent'=>0,'category'=>'Test')),
);
echo '---Original Array---';
echo "<pre>"; print_r($array); echo "</pre>";

$tree = array();

// flat
foreach($array as $leaves) 
{
    foreach($leaves as $leaf) {
        $tree[$leaf['category_id']] = $leaf;
    }
}

//sort by parent
uasort($tree, 'parentSort');
function parentSort($a, $b) {
    if($a['parent'] == $b['parent']) {
        return 0;
    }
    return ($a['parent'] > $b['parent']) ? -1 : 1;
}
echo '---Flat Array---';
echo "<pre>"; print_r($tree); echo "</pre>";

// order
foreach($tree as $leaf)
{
    if ($leaf['parent'] != 0) {

        $tree[$leaf['parent']]['child'][] = $tree[$leaf['category_id']];
        unset($tree[$leaf['category_id']]);
    }
}

//sort back by parent
ksort($tree);

echo '---Tree Array---';
echo "<pre>"; print_r($tree); echo "</pre>";