我知道eval()
使用起来很糟糕,但我无法想出更好的方法。
我想使用以下方法从多维数组中删除项目,如果项目存在,则应删除该项目。
public function delete(){
$keys = func_get_args();
$str = "";
foreach($keys as $key){
$str .= "['$key']";
}
eval("if(isset(\$_SESSION$str)){unset(\$_SESSION$str);}");
}
要使用它我会像这样打电话:
$obj->delete("one", "two", "three");
这相当于:
if(isset($_SESSION["one"]["two"]["three"])){
unset($_SESSION["one"]["two"]["three"]);
}
有没有比使用eval()
更好的方法呢?
答案 0 :(得分:4)
Ouzo Goodies中有一个类似的功能:
Arrays::removeNestedKey($_SESSION, ['one', 'two', 'three']);
如果您不想包含lib,可以查看source code并获取函数本身:
public static function removeNestedKey(array &$array, array $keys)
{
$key = array_shift($keys);
if (count($keys) == 0) {
unset($array[$key]);
} else {
self::removeNestedKey($array[$key], $keys);
}
}
答案 1 :(得分:1)
这将实现您的目标:
function delete(){
$keys = func_get_args();
$ref = &$_SESSION;
for($x = 0; $x < sizeOf($keys)-1; $x++) {
$ref = &$ref[$keys[$x]];
}
unset($ref[$keys[sizeOf($keys)-1]]);
unset($ref);
}