参考是将项添加到数组

时间:2015-01-19 23:59:03

标签: php arrays reference

我有以下方法,您可以在其中传递项目列表,第一项是您希望查看的项目(如果存在),以下项目是项目的路径。

在下面我有2个print_r语句,一个在for之前,一个在它之后。

public function exists(){
    $keys  = func_get_args();
    $value = array_shift($keys);

    $ref = &$_SESSION;
    print_r($_SESSION);
    for($x = 0; $x < sizeof($keys); $x++){
        $ref = &$ref[$keys[$x]];
    }
    print_r($_SESSION);
    if(!is_array($ref)){
        unset($ref);
        return false;
    }
    $found = in_array($value, $ref);
    unset($ref);
    return $found;
}

当我这样称呼时:

$obj->exists(123, "cart");

我从那些print_r得到了这两个数组:

Array
(
    [id] => 1
    [email] => xxx@xxx.com
    [user] => TheColorRed
    [first] => Billy
    [last] => Bob
    [ZingLoggedIn] => 1
)
Array
(
    [id] => 1
    [email] => xxx@xxx.com
    [user] => TheColorRed
    [first] => Billy
    [last] => Bob
    [ZingLoggedIn] => 1
    [cart] => 
)

我的问题是,为什么要向数组添加cart?它应该只是检查它是否存在。

1 个答案:

答案 0 :(得分:2)

这是在数组元素上使用引用的副作用;如果元素不存在则会创建。之后的unset()不会改变这一点。考虑不使用引用;由于您只是阅读这些值,因此不应该发生写入时的复制:

public function exists()
{
    $keys  = func_get_args();
    $value = array_shift($keys);

    $ref = $_SESSION;
    foreach ($keys as $key) {
        if (!isset($ref[$key])) {
            return false;
        }
        $ref = $ref[$key];
    }
    return is_array($ref) && in_array($value, $ref);
}