不使用 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);
}