せずに私はwords.separated.by.dotsキーを使用してデータを格納/アクセスデータを保持するクラスを持っており、それは以下のように振る舞うことを達成するためにしかし、unsetParam()メソッドはひどく実装されていました。私はeval()関数なしでそれを達成する方法を知らなかったので、それが起こった。動作していますが、それは本当に難しいアルゴリズムであり、eval()を使用せずにこれを達成しようとすると楽しいかもしれないことがわかりました。PHPのアルゴリズムがどのように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