set("a.b.c", 123);
//不明白为什么会出那样的结果,形参有固定吗?再举多个例子吧

解决方案 »

  1.   

    $config = array();function set($path, $value) {
      global $config;
      $p = str_replace('.', "']['", $path);
      eval("\$config['$p'] = \$value;"); 
    }function get($path='') {
      global $config;
      if(empty($path)) return $config;
      $p = str_replace('.', "']['", $path);
      return eval("return \$config['$p'];"); 
    }set("a.b.c", 123);
    print_r(get());
    print_r(get("a.b.c"));
      

  2.   

    老大发话了,我就耍一回,数组学的不好,写写想法:
    function set($path, $value) {
    分割$path,写入数组array,然后array_push($array,$value)
    根据count($array)循环写入新的多维数组。//卡在这了????
    }
    function get($path='') {
    global $config;
    if(empty($path)) return $config;
    else{直接返回多位数组的最后一维的值。(可根据$path的个数判断此数组是几维)}
    }
      

  3.   

    set("a.b.c", 123);
    //不明白为什么会出那样的结果,形参有固定吗?再举多个例子吧
    后面已经说了
    将给定的字符串"a.b.c"转换成$config的多级关联数组
    就是说会生成
    $config['a']['b']['c'] = 123;这样的数组需要说明的是
    set函数有覆盖性

    set("a.b", 123);
    set("a.b.c", 345);
    操作是合法的,后面的操作会覆盖前面的,
    而get一个不存在的键值会返回NULL,

    get("a.b.e.f") = null;
    并不会报错我开始也想到了EVAL,但是我上面提到的两个要求用EVAL就比较困难,
    而且eval让代码很难看懂,用引用的办法解决了。
    我的写法下班的时候贴,想看看都有什么思路,
      

  4.   

    to jinliangonline(水清无鱼) 
    把你的 set() 补全
    function set($path, $value) {
      global $config;
      $p = explode('.', $path);
      $t =& $config;
      foreach($p as $k) {
        if(!isset($t[$k])) $t[$k] = array();
        $t =& $t[$k];
      }
      $t = $value;
    }
      

  5.   

    使用eval同样能保证“get一个不存在的键值会返回NULL”
    var_dump(get("a.b.c.p")); //out NULL而满足:
    set("a.b", 123);
    set("a.b.c", 345);
    操作是合法的,后面的操作会覆盖前面的,
    则需要
    function set($path, $value) {
      global $config;
      $p = explode('.', $path);
      $t =& $config;
      foreach($p as $k) {
        if(!is_array($t[$k])) $t[$k] = array();
        $t =& $t[$k];
      }
      $t = $value;
    }不过
    set("a.b", 123);
    set("a.b.c", 345);
    若产生
    Array
    (
        [a] => Array
            (
                [b] => Array
                    (
                        [0] => 12
                        [c] => 123
                    )
            )
    )
    这样的数组,应该也是允许的吧?
    不过楼主并没有详细描述他的需求。
      

  6.   

    嗯。后面的算法和我的差不多我这个主要是应用在快速存取一些配置信息上,我用了一个类来包装class Config
    {
    //配置数组
    static private $ini  = array(); //禁止访问构造函数
    private function __construct() {} /**
     * 更改配置信息 
     *
     * 字符串可以使用set('dsn.driver','Mysql')的形式来设置子选项
     *
     * @param string|array $key 键名 可以是数组或字符串
     * @return
     */
    public static function set($key, $value=null)
    {
    if(is_array($key) && is_null($value))
    self::$ini = array_merge(self::$ini, $key);
    else
    {
    $arr = explode(".", $key);
    $pt  = &self::$ini;
    while($arr)
    {
    if(!is_array($pt)) $pt = array();
    $k = array_shift($arr);
    $pt = &$pt[$k];
    }
    $pt = $value;
    }
    } //取得配置信息
    public static function get($key=null)
    {
    if(is_null($key)) return self::$ini;
    $arr = explode(".", $key);
    //用引用方式查找关联数组
    $pt  = &self::$ini;
    while($arr)
    {
    if(!is_array($pt)) return null;
    $k = array_shift($arr);
    $pt = &$pt[$k];
    }
    return $pt;
    } //载入配置文件或配置数组
    public static function load($ini)
    {
    if(is_array($ini))
    self::$ini = $ini;
    else
    {
    if(!file_exists($ini))
    throw new Exception(sprintf("配置文件不存在 -> <span class='red'>%s</span>",$ini));
    self::$ini = require_once($ini);
    } }}
    Config::set("a", 'test');
    Config::set("c.d.e.f", 123);
    Config::set("c.d.e", array(1,2,3));
    print_r(Config::get());
      

  7.   

    不过
    set("a.b", 123);
    set("a.b.c", 345);产生...........这样的数组,应该也是允许的吧?
    这样的话前面的还要改一下
    if(!is_array($pt)) $pt = array();
    =>
    if(!is_array($pt) && isset($pt)) $pt = array($pt);
      

  8.   

    set("a.b.c", 123);
    //结果为
    Array
    (
        [a] => Array
            (
                [b] => Array
                    (
                        [c] => 123
                    )
            )
    )
    =====================
    那如果set("a.b.c.d", 123);得到
    Array
    (
        [a] => Array
            (
                [b] => Array
                    (
                        [c] => array
                            (
                               [d] => 123
                            )
                    )
            )
    )
    这样是不是就要覆盖上以层的?
      

  9.   

    还是要下面一样?
    Array
    (
        [a] => Array
            (
                [b] => Array
                    (
                        [c] => array
                            (
                               [0] => 123
                            )
                    )
            )
    )
      

  10.   

    function set($path, $value)
    {
        global $config;
        $a = explode(',', $path);
        $t = array($a[count($a)-1] => $value);
        for($i = count($a)-2; $i>=0; $i--)
        {
            $t = array($a[$i] => $t);
        }
        $config = $t;
    }