2

重複の可能性:
配列構造を持つ文字列から配列へ

「db/yum / user」という文字列があり、/の各要素がより深い次元になるように展開しようとしています。

したがって、データ変数を作成する直接的な方法は次のようになります。

$config['db']['yum']['user'] = "val";

これまでの私の試み:

$config = array();              
  function set_config($key,$value){
global $config;

        //Multi deminsional config
        $multi_configs = explode('/',$key);
        if($multi_configs!==false){
            $build_up = array();
            $c =& $build_up;

            foreach($multi_configs as $multi_config){
                $c[$multi_config] = array();
                $c     =& $c[$multi_config];
            }
            //$c = $value;
            array_merge($config,$c);
            return;
        }


        $config[$key] = $value;
    }
               set_config('db/yum/user','val');
               set_config('db/yum/server','val2');
                //etc,etc,etc, this was modified to make more sense in this context.
4

2 に答える 2

10

これはおそらくあなたが探しているものです:

#!/usr/bin/php
<?php

$config = array();

function set_config($key, $value) {
  global $config;

  if (FALSE=== ($levels=explode('/',$key)))
    return;

  $pointer = &$config;
  for ($i=0; $i<sizeof($levels); $i++) {
    if (!isset($pointer[$levels[$i]]))
      $pointer[$levels[$i]]=array();
    $pointer=&$pointer[$levels[$i]];
  } // for

  $pointer=$value;
} // set_config

set_config('db/yum/user','val');
set_config('db/yum/server','val2');

print_r($config);

?>

出力は次のとおりです。

Array
(
    [db] => Array
        (
            [yum] => Array
                (
                    [user] => val
                    [server] => val2
                )

        )

)
于 2012-11-09T13:47:37.923 に答える
2

配列内のツリー構造を使用して同じソリューションを実現することもできます。配列を作成するコードは次のとおりです。

$arr = array (5,6);

$new_arr=array ();
$prev=0;

foreach ($arr as $val) {
    $new_arr[$prev] = $val;
    $prev=$val;
}

$new_arr[$prev]="value";

値を取得するコードは次のとおりです。

    function retrieve ($arr) {

    $prev=0;
    while (1) {
        if (! isset($arr[$prev] ) )
            break;
        else $prev = $arr[$prev];

    }       
    return $prev;       
}
于 2012-11-09T14:15:15.650 に答える