儘管這個問題已經被回答(並接受)我就拋出這個版本出來有對未來的訪客:
(可能會丟失一些檢查,我有這幾個版本踢左右)
class Map
{
protected $_array = array();
protected $_separator;
public static function get(Array $array, $key, $separator)
{
$parts = explode($separator, $key);
$key = array_shift($parts);
while (!empty($parts))
{
if (!isset($array[$key]) || !is_array($array[$key]))
{
return null;
}
$array = &$array[$key];
$key = array_shift($parts);
}
return isset($array[$key]) ? $array[$key] : null;
}
public static function has(Array $array, $key, $separator)
{
$parts = explode($separator, $key);
$key = array_shift($parts);
while (!empty($parts))
{
if (!isset($array[$key]) || !is_array($array[$key]))
{
return false;
}
$array = &$array[$key];
$key = array_shift($parts);
}
return isset($array[$key]);
}
public static function set(&$array, $key, $value, $separator)
{
$parts = explode($separator, $key);
$key = array_shift($parts);
while (!empty($parts))
{
if (!isset($array[$key]) || !is_array($array[$key]))
{
$array[$key] = array();
}
$array = &$array[$key];
$key = array_shift($parts);
}
$array[$key] = $value;
}
public static function bind(&$array, $key, &$variable, $separator)
{
$parts = explode($separator, $key);
$key = array_shift($parts);
while (!empty($parts))
{
if (!isset($array[$key]) || !is_array($array[$key]))
{
$array[$key] = array();
}
$array = &$array[$key];
$key = array_shift($parts);
}
if (isset($array[$key]))
{
$variable = $array[$key];
}
$array[$key] = &$variable;
}
public static function remove(&$array, $key, $separator)
{
$parts = explode($separator, $key);
$key = array_shift($parts);
while (!empty($parts))
{
if (!isset($array[$key]) || !is_array($array[$key]))
{
return;
}
$array = &$array[$key];
$key = array_shift($parts);
}
unset($array[$key]);
}
public function __construct(&$array, $separator)
{
if (!is_array($array))
{
$array = array();
}
$this->_array = $array;
$this->_separator = (string) $separator;
}
public function __get($key)
{
return static::get($this->_array, $key, $this->_separator);
}
public function __isset($key)
{
return static::has($this->_array, $key, $this->_separator);
}
public function __set($key, $value)
{
static::set($this->_array, $key, $value, $this->_separator);
}
public function __unset($key)
{
static::remove($this->_array, $key, $this->_separator);
}
public function get_array()
{
return $this->_array;
}
}
而且使用它像:
$array = array(
'foo' => array(
'bar' => array(
'hello' => 'world',
),
),
);
$map = new Map($array, '.');
var_dump($map->{'foo.bar.hello'});
//string(5) "world"
$map->{'foo.bar.goodbye'} = 'universe';
unset($map->{'foo.bar.hello'});
var_dump($map->get_array());
// array(1) {
// ["foo"]=>
// array(1) {
// ["bar"]=>
// array(1) {
// ["goodbye"]=>
// string(8) "universe"
// }
// }
// }
var_dump(isset($map->{'foo.bar.goodbye'}));
// true
綁定是非常有用的,但沒有一個神奇的方法與語義別名它。
來源
2012-01-06 05:49:40
Dan
太棒了。我只是鍵入一個遞歸函數來完成這項工作,但你的工作非常出色。 :D – Turbotoast
是的,這將給出正確的$部分,但如果我添加$ piece = $ newValue;並轉儲$配置,然後$配置中的值沒有改變,這就是我以後,對不起,如果這不明確:) – Gcoop
同意問題是$ config是一個嵌套關聯數組,我使用像「memory.caching」這樣的鍵可以獲得一個值,這很好,除非以一種很好的方式設置值是棘手的。理想的解決方案是重寫數值如何放入$ config中,因此它不是嵌套的關聯數組!但我正在努力削減一個角落,而不是那麼做! :) – Gcoop