0

$arr次のような1 次元配列があるとします。

Array
(
    ['key1'] => 1
    ['key2'] => 1
    ['key3'] => 1
    ['key4'] => 1
)

私はこのようにループしたい$arr

foreach($arr as $key => $a) {
   //$tree[????] = ????? Here is my concern
}

そうすることでprint_r($tree)

Array
(
    ['key1'] => Array
    (
        ['key2'] => Array
        (
            ['key3'] => Array
            (
                ['key4'] => 1
            )
        )
    )
)

私の懸念は、配列であり、に等しいような$tree単一次元配列からループ内の配列の次元 (値ではない) を増やす方法です。$numbers$tree['key1']['key2']['key3']$tree['key1']['key2']['key3']['key4']1

$fooさらに、 10 個の要素を持つ 1 次元配列があるとします。$bar上記の出力と同様に、10 次元配列に展開される別の配列を生成する必要があります。

foreachループ内で何をすべきですか?または、ループを使用する代わりに、1 次元配列から上記のような出力を生成する方法はありますか?


編集:

明らかにある種の再帰関数が必要ですが、表示するデータに基づいて、key2 が key1 の子である必要があること、key3 が key2 の子である必要があることなどをどのように知っているか説明できますか?

1D 配列の次の要素は、前の要素の子です。したがって、1D 配列が次のような場合:

Array
(
    ['bar'] => 1 // I don't care of the values as of the moment
    ['foo'] => 1
    ['baz'] => 1
)

要素fooは の子である必要がbarあり、要素はツリー配列のbazの子である必要があります。foo

わかりましたので、最後の要素を除くすべての実際の値は無関係ですか?

実際には、1D 配列のすべての値は現時点では無関係です。私はツリー配列の構築にのみ関心があります。

4

2 に答える 2

3

これを行う方法は、参照を使用することです。

function create_tree($arr) {
  $result = array();
  $ref = &$result;
  foreach ($arr as $key => $el) {
    $ref = array($key => $el);
    $ref =& $ref[$key];
  }
  return $result;
}

使い方:

$result = array(); // an array to hold the result

$ref = &$result; // start with a reference to the top level

foreach ($arr as $key => $el) { // iterate over the input array

  $ref = array($key => $el); // create this level in the array

  $ref =& $ref[$key]; // change the reference to be the new deepest level

}

return $result; // return the result

動いているのを見る

于 2013-01-03T11:09:17.527 に答える
2

参照による割り当ては、これに役立つようです。

$tree = array();
$node =& $tree;
foreach ($arr as $key => $a) {
    $node =& $node[$key];
    $node = array();
}
$node = end($arr);
于 2013-01-03T11:05:18.127 に答える