好吧,这可能会令人困惑。我正在尝试为自己创建一个配置类,我希望它的用法是这样的:
$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;
}
}
}
}
答案 0 :(得分: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;
}
答案 1 :(得分: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