2013-08-25 109 views
0

將其重寫爲更具體。如何從一個鍵數組創建一個PHP關聯數組?

我有一個csv文件。每一行都有一個字段,它可以分解爲一個表示類別樹的數組。所以,第一個三排可能成爲數組,因爲這樣的:

array('food', 'fruit', 'red', 'apple') 
array('food', 'fruit', 'green', 'kiwi') 
array('beauty', 'makeup', 'lipstick') 

它應該是一棵樹,雖然。我註定要與結束:

food 
    fruit 
     red 
      apple 
     green 
      kiwi 
beauty 
    makeup 
     lipstick 

從這個的主要區別和幾十個類似的問題,我已經看到了提問和回答是沒有保證的數量水平的每個記錄讀取,不同的可能性一個記錄可能沒有與另一個記錄相同的密鑰。所以array_merge似乎失敗,因爲使用+

唯一的保證是,對於任何記錄,假定鍵列表,開始在陣列的頂層,這樣做,如果有

rec1 = animal, fish, shark 
rec2 = fish, shark, hammerhead 

該預期的結果

animal 
    fish 
     shark 
fish 
    shark 
     hammerhead 

回答

2
$i = count($array) - 1; 
$new_array = $array[ $i ]; 

while ($i--) { 
    $new_array = array($array[ $i ] => $new_array); 
} 

看到它在這裏的行動:http://codepad.viper-7.com/bVWYrN

+0

所以對於一個記錄,這看起來工作。但是如果下一個記錄讀數是('食物','水果','綠色','奇異果')......那麼如果兩個指數已經存在呢? – Ayen

+0

@Ayen - 深度是否有保證?意思是說,所有的陣列都有四個項目? –

+0

不是,它是一種飼料的產品,所以可以有: 美容 - >護膚霜或 美容 - >化妝 - >脣膏 - >光澤 – Ayen

0

這是一個可能的解決方案,使用遞歸。

<?php 
$foo = array('food', 'fruit', 'red', 'apple'); 

function categorize($arr) { 
     if (count($arr) > 2) { 
       $temp[$arr[0]] = categorize(array_slice($arr, 1)); 
     } else { 
       $temp[$arr[0]] = array($arr[1]); 
     } 
     return $temp; 

} 
print_r(categorize($foo)); 

輸出:

Array 
(
    [food] => Array 
     (
      [fruit] => Array 
       (
        [red] => Array 
         (
          [0] => apple 
         ) 

       ) 

     ) 

) 

連接其它的實例: http://codepad.org/xmK1oYy1

相關問題