简体   繁体   中英

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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