J'ai une classe qui conserve les données des banques de données/accès à l'aide des touches de words.separated.by.dots et il se comporte comme ce qui suit:algorithme Php - Comment y parvenir sans 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]'
)
);
*/
Il travaille , mais la méthode unsetParam() a été horriblement implémentée. Cela est arrivé parce que je ne savais pas comment y parvenir sans la fonction eval(). Bien que cela fonctionne, j'ai trouvé que c'était un algorithme très difficile et que vous pourriez trouver amusant d'essayer d'y parvenir sans 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;
}
}
La méthode d'essai:
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'));
}
utilisation créative des références :) – Kato
Très agréable! Merci beaucoup! – Marcelo