从数组创建多维数组

时间:2014-01-07 14:33:13

标签: php arrays multidimensional-array

我正在尝试从线性数组创建一个多维数组。

这个数组:

$array = array(
    array('level-one', 'level-two', 'level-three'),
    array('level-one', 'level-two', 'level-three', 'level-four'),
    array('level-one', 'level-two', 'level-three', 'level-four', 'item 1'),
    array('level-one', 'level-two', 'level-three', 'level-four', 'item 2'),
    array('level-one', 'level-two', 'level-three', 'level-four', 'item 3'),
    array('level-one', 'level-two', 'level-three', 'level-four', 'item 4'),
);

分为:

$multi = array(
    'level-one' => array(
        'level-two' => array(
            'level-three' => array(
                'level-four' => array(
                    'item 1',
                    'item 2',
                    'item 3',
                    'item 4',
                )
            )
        )
    )
);

我想我应该以某种方式递归,但我找不到递归解决方案逻辑。

4 个答案:

答案 0 :(得分:1)

你可以试一试

function to_nested($ary){
    $a = array();
    foreach ( $ary as $rec ){
        $b = &$a;
        $node = null;
        foreach ( $rec as $f ){
            if ( $node !== null ){
                if ( !isset($b[$node]) ){
                    $isleaf = array_search($node,$b);
                    if ( $isleaf !== false )
                        unset($b[$isleaf]);
                    $b[$node] = array();
                }
                $b = &$b[$node];
            }
            $node = $f;
        }
        //push leaf
        if ( empty($b) ){
            $b = array();
        }
        array_push($b, $f);
    }

    return $a;
}

$array = array(
    array('level-one', 'level-two', 'level-three'),
    array('level-one', 'level-two', 'level-three', 'level-four'),
    array('level-one', 'level-two', 'level-three', 'level-four', 'item 1'),
    array('level-one', 'level-two', 'level-three', 'level-four', 'item 2'),
    array('level-one', 'level-two', 'level-three', 'level-four', 'item 3'),
    array('level-one', 'level-two', 'level-three', 'level-four', 'item 4'),
);

print_r(to_nested($array));

结果:

Array (
    [level-one] => Array
        (
            [level-two] => Array
                (
                    [level-three] => Array
                        (
                            [level-four] => Array
                                (
                                    [0] => item 1
                                    [1] => item 2
                                    [2] => item 3
                                    [3] => item 4
                                )
                        )
                )
        )
)

我不确定您的输入数组的规则是什么,因此我建议您使用不同的有效输入来查看此函数的结果是否适合您。

答案 1 :(得分:1)

尝试

$data=array();
for($i=0;$i<sizeof($array);$i++){
        $tmp=array();
    $data =  array_unique(array_merge($data,$array[$i]));
}

现在删除了重复的条目。 现在创建一个多维数组

$output=array();
$tmp = &$output;
foreach($data as &$val){
  if(strpos($val,'level') !==false ){
     if (!is_array($tmp)){
          $tmp = array();
      }
      $tmp = &$tmp[$val];

  }else{
    $tmp[] = $val;
  }
}

echo "<pre>";
print_r($output);
exit();

答案 2 :(得分:1)

$last_array = end($array);

// Create an array like your structure, i.e.
// ['level-one', 'level-two', 'level-three', 'level-four'].
$structure = array_slice($last_array, 0, -1);

// Remove all arrays, but the ones with items.
$neat_array = array_filter($array, function($current_array) use ($last_array) {
    return sizeof($current_array) === sizeof($last_array);
});

// Create an array of just your items, i.e.
// ['item 1', 'item 2', 'item 3', 'item 4'].
$items = array_map(function($item) use ($structure) {
    return $item[sizeof($structure)];
}, $neat_array);

// And the final product.
$multi = array_reduce(array_reverse($structure), function($result, $item) {
    return array($item => $result);
}, $items);

print_r($multi);

输出将符合要求:

Array
(
    [level-one] => Array
        (
            [level-two] => Array
                (
                    [level-three] => Array
                        (
                            [level-four] => Array
                                (
                                    [2] => item 1
                                    [3] => item 2
                                    [4] => item 3
                                    [5] => item 4
                                )

                        )

                )

        )

)

答案 3 :(得分:0)

 $array1=array(
  'level1'=>array(
     'level2'=>array(
       'level3'=>array(
          'level4'=>array(
             'A'=>'value1',
                 'B'=>'value2',
                 'C'=>'value3',
                 'D'=>'value4'
             )
           )
         )
       )
    );
    print_r($array1);