2014-01-07 228 views
0

我想从线性数组创建一个多维数组。从数组创建多维数组

这个数组:

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

我想我应该去莫名其妙的递归,但我不能找到一个递归解决方案的逻辑。

+0

水平计数被固定? –

+4

我必须问*为什么*你这样做。这是你从其他地方获得需要操作的数组吗?还是你在创建它?这看起来类似于XML;原来是这样吗?也许走这条路是不正确的方向,我们可以在这个过程中的另一个步骤。 – Andrew

+0

都是多维数组 – DNACode

回答

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

我不知道规则是什么您的输入数组,因此我们建议您使用不同的玩有效的输入来查看这个函数的结果是否适合你。

+0

只是完美和完美! –

+0

很高兴听到它。 oops刚刚注意到,如果具有相同键名的数组已经存在于同一级别,则可以用if(!isset($ b [$ node])){}来包围推叶代码,以防止创建叶。如果说“array('level-1','level-2','level-3'),可能会发生这种情况,”它位于示例输入数组的底部,而不是顶部。 – KorreyD

+0

我认为数组的最后一项也必须是关联的。不是[0] =>项目1是允许的 –

0
$array1=array(
    'level1'=>array(
    'level2'=>array(
     'level3'=>array(
      'level4'=>array(
      'A'=>'value1', 
       'B'=>'value2', 
       'C'=>'value3', 
       'D'=>'value4' 
      ) 
      ) 
     ) 
     ) 
    ); 
    print_r($array1); 
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(); 
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 
           ) 

         ) 

       ) 

     ) 

)