不使用 eval 按键查找 Item
Find Item by key without using eval
我知道 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()
更好的方法?
在Ouzo Goodies中有一个类似的功能:
Arrays::removeNestedKey($_SESSION, ['one', 'two', 'three']);
如果不想包含库,可以查看 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);
}
}
这将实现你想要的:
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);
}
我知道 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()
更好的方法?
在Ouzo Goodies中有一个类似的功能:
Arrays::removeNestedKey($_SESSION, ['one', 'two', 'three']);
如果不想包含库,可以查看 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);
}
}
这将实现你想要的:
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);
}