0

これは混乱するかもしれません。私は自分用に構成クラスを作成しようとしていますが、その使用法を次のようにしたいと考えています。

$this->config->add('world', 'hello');
// This will create array('hello' => 'world')

私の質問は、存在しない多次元配列に値を追加したいが、次のようなものを使用して作成したい場合です。

$this->config->add('my value', 'hello => world');
// This should create array('hello' => array('world' => 'my value'))

$this->config->add('my value', 'hello => world => again');
// This should create array('hello' => array('world' => array('again' =>'my value')))

'hello => world'配列の最後の要素に値が設定された配列に変換できません。

これは私がこれまでに持っているものです。

    public function add($val, $key = null)
    {
        if (is_null($key))
        {
            $this->_config = $val;

        } else {

            $key = explode('=>', str_replace(' ', '', $key));

            if (count($key) > 1)
            {
                // ?

            } else {

                if (array_key_exists($key[0], $this->_config))
                {
                    $this->_config[$key[0]][] = $val;

                } else {

                    $this->_config[$key[0] = $val;
                }
            }
        }
    }
4

2 に答える 2

0

これを試すことはできますが、$this->_config の他のデータが消去されます

... more code
if (count($key) > 1)
{
// ?
    $i = count($key) - 1;
    while($i >= 0) {
        $val = array($key[$i] => $val);
        $i--;
    }

    $this->_config = $val;
}
... more code
于 2012-08-22T08:01:20.107 に答える
0
public function add($val, $key = null)
{
    $config=array();
    if (is_null($key))
    {
        $this->config = $val;

    } else {
        $key = explode('=>', str_replace(' ', '', $key));
        $current=&$this->config;
        $c=count($key);
        $i=0;
        foreach($key as $k)
        {
            $i++;
            if($i==$c)
            {
                $current[$k]=$val;
            }
            else
            {
                if(!isset($current[$k]) || !is_array($current[$k])) $current[$k]=array();
                $current=&$current[$k];
            }
        }
    }
}

これは再帰的なバージョンです。これはより多くのリソースを消費します:

public function add($val, $key = null)
{
    $this->config=array();
    if (is_null($key))
    {
        $config = $val;
    } else {
        $key = array_reverse(explode('=>', str_replace(' ', '', $key)));
        self::addHelper($val,$key,$config);
    }
}
private static function addHelper(&$val,&$keys,&$current)
{
    $k=array_pop($keys);
    if(count($keys)>0)
    {
        if(!isset($current[$k]) || !is_array($current[$k])) $current[$k]=array();
        addHelper(&$val,$keys,&$current[$k]);
    }
    else $current[$k]=$val;
}
于 2012-08-22T07:45:24.200 に答える