2014-01-07 226 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 
           ) 

         ) 

       ) 

     ) 

)