0

これが私のプリコードです...

$keys = array('a', 'b', 'c', 'd');
$number = 10;

そして、ここに私のコードがあります...

eval('$array[\''.implode('\'][\'',$keys).'\'] = $number;');

これを使用すると、次の結果が得られます...

Array (
    [a] => Array
        (
            [b] => Array
                (
                    [c] => Array
                        (
                            [d] => 10
                        )
                )
        )
)

さて、問題は、これがまさに私が望む結果であるということですが、私は を使用したくありませんeval()

コードへの入力として、 と のリストがkeysありnumberます。は、特定の配列の子ベースの生成に使用される配列numberの値に設定する必要があります。keyskeys$array

これを達成する別の方法はありますか?コードが機能するため、キー/番号を新しい値で上書きしたくありません-eval()これは既に保持されているため、新しいコードでも同じことを行う必要があります。

4

3 に答える 3

3

以下のコード (評価するもの) は警告を生成するため、エラー報告が最大のプロジェクトでは機能しないことに注意してください。

$array = array();
$array['a']['b'] = 42; // $array['a'] is not an array... yet

PHP 5 を使用しているため、変更したいツリーのブランチをトラバースしながら、参照を操作して配列を操作できます。

$current = & $array;

foreach ($keys as $key):

  if (!isset($current[$key]) || !is_array($current[$key]))
    $current[$key] = array();

  $current = & $current[$key];

endforeach;

$current = $value;

編集:警告と競合を回避するために修正されました。

于 2009-12-29T16:14:05.233 に答える
1
function deepmagic($levels, $value)
{
    if(count($levels) > 0)
    {
        return array($levels[0] => deepmagic(array_slice($levels, 1),
            $value));
    }
    else
    {
        return $value;
    }
}

$a = deepmagic(Array('a', 'b', 'c', 'd'), 10);

var_dump($a);

出力:

array(1) {
  ["a"]=>
  array(1) {
    ["b"]=>
    array(1) {
      ["c"]=>
      array(1) {
        ["d"]=>
        int(10)
      }
    }
  }
}
于 2009-12-29T16:19:13.690 に答える
1

これがどのように機能するかを示す完全なコード例を次に示します。重要なのは、配列への参照を使用して変更できるようにすることです。

<?php
    $keys = array('a', 'b', 'c', 'd'); 
    $number = 10;

    $org_array = array(
        "a" => "string",
        "z" => array( "k" => false)
      );

    function write_to_array(&$array, $keys, $number){
      $key = array_shift($keys);
      if(!is_array($array[$key])) $array[$key] = array();
      if(!empty($keys)){
        write_to_array($array[$key], $keys, $number);
      } else {
        $array[$key] = $number;
      }
    }

    write_to_array($org_array, $keys, $number);

    print_r($org_array);
?>
于 2009-12-29T16:17:53.040 に答える