简体   繁体   English

从数组创建多维数组

[英]Create multidimensional array from array

I am trying to create a multidimensional array from a linear array. 我正在尝试从线性数组创建多维数组。

This 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'),
);

Into: 进入:

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

I guess I should go somehow recursive but I can't find a recursive solution logic. 我想我应该以某种方式进行递归,但是我找不到递归的解决方案逻辑。

You can give this a go 你可以试试看

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

result: 结果:

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
                                )
                        )
                )
        )
)

I'm not sure what the rules are for your input array so I'd suggest that you play around with different valid inputs to see if the results of this function work for you. 我不确定输入数组的规则是什么,因此建议您使用不同的有效输入,以查看此函数的结果是否对您有用。

Try 尝试

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

Now duplicate entries have been removed. 现在,重复的条目已被删除。 Now create a multidimensional array 现在创建一个多维数组

$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();
$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);

And the output will be as desired: 输出将是所需的:

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
                                )

                        )

                )

        )

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM