我有使用words.separated.by.dots键保存数据存储/数据访问类,它成为如下:PHP的算法 - 如何实现,如果没有EVAL
$object = new MyArray()
$object->setParam('user.name','marcelo');
$object->setParam('user.email','[email protected]');
$object->getParams();
/*
array(
'user' => array(
'name' => 'marcelo',
'email' => '[email protected]'
)
);
*/
据工作,但unsetParam()方法实施起来非常可怕。发生这种情况是因为我不知道如何在没有eval()函数的情况下实现这个功能。虽然它在工作,但我发现它是一个非常具有挑战性的算法,并且您可能会发现试图在没有eval()的情况下实现这一点。
class MyArray {
/**
* @param string $key
* @return Mura_Session_Abstract
*/
public function unsetParam($key)
{
$params = $this->getParams();
$tmp = $params;
$keys = explode('.', $key);
foreach ($keys as $key) {
if (!isset($tmp[$key])) {
return $this;
}
$tmp = $tmp[$key];
}
// bad code!
$eval = "unset(\$params['" . implode("']['", $keys) . "']);";
eval($eval);
$this->setParams($params);
return $this;
}
}
测试方法:
public function testCanUnsetNestedParam()
{
$params = array(
'1' => array(
'1' => array(
'1' => array(
'1' => 'one',
'2' => 'two',
'3' => 'three',
),
'2' => array(
'1' => 'one',
'2' => 'two',
'3' => 'three',
),
)
),
'2' => 'something'
);
$session = $this->newSession();
$session->setParams($params);
unset($params['1']['1']['1']);
$session->unsetParam('1.1.1');
$this->assertEquals($params, $session->getParams());
$this->assertEquals($params['1']['1']['2'], $session->getParam('1.1.2'));
}
创意使用参考:) – Kato
非常好!非常感谢你! – Marcelo