2016-08-19 55 views
-2

你會怎樣改變一個單維數組PHP中的多維數組?假設你有這樣的事情變換單維PHP數組成多維一個

$array['breakfast'] = 'milk'; 
$array['meal.firstdish'] = 'pasta'; 
$array['meal.seconddish.maincourse'] = 'veal'; 
$array['meal.seconddish.dressing'] = 'fries'; 
$array['meal.dessert'] = 'pie'; 

你想要的功能將其改造成

$array['breakfast'] = 'milk'; 
$array['meal']['firstdish'] = 'pasta'; 
$array['meal']['seconddish']['maincourse'] = 'veal'; 
$array['meal']['seconddish']['dressing'] = 'fries'; 
$array['meal']['dessert'] = 'pie'; 

當然,同樣的功能要轉變

$tire['ean'] = '3286347717116'; 
$tire['brand.maker'] = 'BRIDGESTONE'; 
$tire['brand.model.name'] = 'POTENZA'; 
$tire['brand.model.variant'] = 'RE 040 RFT * SZ'; 

$tire['ean'] = '3286347717116'; 
$tire['brand']['maker'] = 'BRIDGESTONE'; 
$tire['brand']['model']['name'] = 'POTENZA'; 
$tire['brand']['model']['variant'] = 'RE 040 RFT * SZ'; 

我正在考慮使用爆炸,然後對結果進行評估,但eval總是感覺像是在欺騙我,我想這會讓我的代碼無法在Hip​​Hop中運行。

我想這樣做的原因是,我不得不從數據庫導出許多不同的表到XML文件,我已經有一個強大的功能,它可將多維數組轉換成XML。

+0

請編輯您的代碼。你錯過了很多。看看_ [ 'meal.firstdish] _應該是_ [' meal.firstdish '] _和_亦[' 飯 '] [' firstdish] _ –

+1

另外,你嘗試過什麼? – Epodax

+0

正如我說,我想我會做A' 而(列表($鍵,$值)=每($陣列)){ \t $ individualKeys =爆炸(,$鍵 ''); \t的eval( 「\ $ newarray [ '」 內爆( 「 '] ['」,$ individualKeys)。 「 '] =' $值';」); \t}' –

回答

0

像這樣:

function build(array &$trg, array $k,$key,$value) { 
    $p = &$trg; 
    while (!empty($k)) { 
     $nk = array_shift($k); 
     if (!isset($p[$nk])) { 
      $p[$nk] = []; 
     } 
     $p = &$p[$nk]; 
    } 
    $p[$key] = $value; 
    return $p; 
} 

$array['breakfast'] = 'milk'; 
$array['meal.firstdish'] = 'pasta'; 
$array['meal.seconddish.maincourse'] = 'veal'; 
$array['meal.seconddish.dressing'] = 'fries'; 
$array['meal.dessert'] = 'pie'; 

$out = []; 
foreach ($array as $key => $value) { 
     $path = explode('.',$key); 
     $last = array_pop($path); 
     build($out,$path,$last,$value); 
} 

print_r($out); 
+0

爲什麼要OP試試這個代碼?一個好的答案**將總是解釋所做的事情以及爲什麼這樣做,不僅是爲了OP,而且是爲了將來SO的訪問者。 –

+0

感謝@cske,爲簡潔優雅的代碼 –

0

你在正確的軌道上explode,但有沒有必要使用eval。一旦你獲得了鑰匙的作品,你可以遍歷它們並逐步指針分配到一個新的數組:

<?php 
$array['breakfast'] = 'milk'; 
$array['meal.firstdish'] = 'pasta'; 
$array['meal.seconddish.maincourse'] = 'veal'; 
$array['meal.seconddish.dressing'] = 'fries'; 
$array['meal.dessert'] = 'pie'; 

$result = []; 
$target = null; 

foreach ($array as $key => $value) { 
    // Start by targeting the base of our resulting array 
    $target =& $result; 

    // Break the keys apart into pieces 
    $keyParts = explode('.', $key); 

    // Assign new target based on indexing into the result array one "piece" at a time 
    while ($part = array_shift($keyParts)) { 
     $target =& $target[$part]; 
    } 

    // Finally, assign the value to our target 
    $target = $value; 
} 

https://eval.in/625627