2012-01-21 35 views
4

これは私を困惑させます。私は検索して同様の質問を見つけましたが、私の正確な問題と一致する質問は見つけられないようです。 PHPで1次元配列を多次元の関連配列に変換する

、私はそうのような配列を持っている:

<?php 
    $array = array('one', 'two', 'three', 'four'); 
?> 

私は次のような多次元配列にこれを変換したい:私は知らない心の中で

<?php 
    $new_array = array('one' => array('two' => array('three' => array('four' => NULL)))); 
    // or, to put another way: 
    $new_array['one']['two']['three']['four'] = NULL; 
?> 

ベアリングいくつのアイテムが元の配列に含まれるか、多次元関連の配列を再帰的に作成する方法が必要です。

これは簡単なことだと思われましたが、これを理解できないようです。

答えて

5

あなたは参照して簡単にそれを行うことができます。

$out = array(); 
$cur = &$out; 
foreach ($array as $value) { 
    $cur[$value] = array(); 
    $cur = &$cur[$value]; 
} 
$cur = null; 

印刷$outはあなたを与える必要があります。

Array 
(
    [one] => Array 
     (
      [two] => Array 
       (
        [three] => Array 
         (
          [four] => 
         ) 
       ) 
     ) 
) 
+0

大変ありがとうございます。参考文献はまだまだ私の頭を十分に引き出すためのものです。 – Sam

1
function recursive_array_convert ($input, &$result = array()) { 
    $thisLevel = array_shift($input); 
    if (count($input)) { 
    if (!isset($result[$thisLevel]) || !is_array($result[$thisLevel])) { 
     $result[$thisLevel] = array(); 
    } 
    recursive_array_convert($input, $result[$thisLevel]); 
    } else { 
    $result[$thisLevel] = NULL; 
    } 
    return $result; 
} 

この関数はあなたに多くの柔軟性を与える必要があります - あなたは、単に渡すことができます入力配列を最初の引数に渡し、結果を戻り値でキャッチするか、既存の変数を2番目の引数に渡して、結果でいっぱいにすることができます。

$result = recursive_array_convert(array('one', 'two', 'three', 'four')); 

...か...

recursive_array_convert(array('one', 'two', 'three', 'four'), $result); 

一見、このオプションでは、ほとんどのポイントが見えるかもしれませんが、考えてみます。これは、あなたがして、あなたの例で欲しいものを達成できることを意味します以下のようになります:

$result = array(); 
recursive_array_convert(array('one', 'two', 'three', 'four'), $result); 
recursive_array_convert(array('five', 'six', 'seven', 'eight'), $result); 
print_r($result); 
/* Output: 

    Array 
    (
    [one] => Array 
     (
     [two] => Array 
      (
      [three] => Array 
       (
       [four] => 
      ) 
     ) 
    ) 
    [five] => Array 
     (
     [six] => Array 
      (
      [seven] => Array 
       (
       [eight] => 
      ) 
     ) 
    ) 
) 

*/ 

ご覧のとおり、同じ変数に好きなだけチェーンを作成できます。