2015-10-15 48 views
-2

我想打開的路徑的陣列,例如這樣的:如何將路徑數組轉換爲深度不同的多維數組?

$foo = [ 
'a/b' => 1, 
'a/c' => 2, 
'x/y/0' => 4, 
'x/y/1' => 5 
] 

成多維陣列狀,看起來像這樣:

$foo = [ 
'a' => [ 'b' => 1, 'c' => 2], 
'x' => [ 'y' => [0, 1] 
] 

的路徑上的陣列可包含路徑的任何深度,並且可以是鍵值對或通過索引訪問的普通數組。我已經嘗試過遞歸,但不能完全弄清楚這一點,即使我有一種感覺,解決方案會很短。有任何想法嗎?

+0

發生了什麼事'4'和5''值?不應該'x'鍵以'[4,5]'so'0 = 4'和'1 = 5'結尾? –

+0

'x/y/0'=> 4且'x/y/1'=> 5意味着'x'=>'y'=>的值是一個數組,而不是一個map/key-值對。說起這種事情,我希望這兩件事情在PHP中有不同的名字,而不是它們都被稱爲'array' – user5451656

+0

,但是接下來'x/y/0'中的'4'和'5'值發生了什麼變化'和'x/y/1'?他們只是消失,不再存在於建議的輸出中。如何處理'x/y/0/test'?另外,你也知道,如果你要對輸出進行json_encode,那麼從零開始的具有連續數字鍵的數組將被轉換爲JS數組,而不是對象('[]',而不是{{}')。如果你想要做的就是丟失值('=>'的右邊)並且把鍵值中的最後一個值加到輸出中,那麼你可以在下面的代碼中做這個。這是一個簡單的測試。 –

回答

0

您可以在不遞歸的情況下使用引用將更深的(並創建新的鍵)移動到輸出數組中。像這樣的東西會工作:

function nest($arr){ 
    //our output array 
    $out = array(); 

    //loop over the array and get each key/value 
    foreach($arr as $k=>$v){ 
     //split the key 
     $k = explode('/', $k); 

     //create our first reference 
     $tmp = &$out; 

     //loop over the keys moving deeper into the output array 
     foreach($k as $key){ 
      //if the key is not found 
      if(!isset($tmp[$key])){ 
       //add it 
       $tmp[$key] = array(); 
      } 
      //get a reference to the sub-array 
      $tmp = &$tmp[$key]; 
     } 

     //here $tmp should be as far down the array as the value needs to be 
     //set the value into the array 
     $tmp = $v; 
    } 
    return $out; 
} 

演示:http://codepad.viper-7.com/unQukp