2016-08-19 9 views
-2

に一次元PHPの配列を変換するどのようにPHPで多次元配列に一次元配列を変換するのでしょうか?あなたはこのは多次元1

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

を変換する必要がある関数が

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

にそれを変換したいとします

I爆発を使用して、結果にevalを使うことを考えていましたが、evalはいつも私に騙されているように感じ、私のコードがHipHopで実行されないようにします。私はこれをしたい

理由は、私はXMLファイルにデータベースから別のテーブルの多くをエクスポートする必要があり、私はすでにXMLに多次元配列を回す強力な機能を持っているということです。このよう

+0

を参照してください、あなたのコードを編集してください。あなたはたくさんのことがありません。 _ ['meal.firstdish] _ _ [' meal.firstdish '] _また[_ meal] [' firstdish] _ –

+1

また何を試しましたか? – Epodax

+0

Iが言ったように、私は{ \t $ individualKeys =($キーを '')爆発 一方(リスト($キー、$値)=各($配列))A'だろうと思いました。 "'] =' $ value ';"); \t eval( "\ $ newarray ['" implode( "'] ['"、$ 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のためだけでなく、将来の訪問者のためにそうした方法で行われたのかについての説明をいつも持っています。 –

+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