Php 引用正在向数组中添加项

Php 引用正在向数组中添加项,php,arrays,reference,Php,Arrays,Reference,我有下面的方法,您可以在中传递一个项目列表,第一个项目是您想要查看它是否存在的,下面的项目是该项目的路径 在下面我有两个print\r语句,一个在for之前,一个在它之后 public function exists(){ $keys = func_get_args(); $value = array_shift($keys); $ref = &$_SESSION; print_r($_SESSION); for($x = 0; $x <

我有下面的方法,您可以在中传递一个项目列表,第一个项目是您想要查看它是否存在的,下面的项目是该项目的路径

在下面我有两个
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;
}
我从那些
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
添加到数组中?它应该只检查它是否存在。

这是在数组元素上使用引用的副作用;如果元素不存在,则会创建它。之后的
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);
}

尝试启用
E_ALL
错误报告级别并首先检查日志。附言:你的
unset
在那里是完全多余的。有趣。在for循环中不会引发未定义的偏移通知吗?如果返回false,可能会执行isset检查并中断。@zerkms我有
error\u reporting=E\u ALL&~E\u DEPRECATED&~E\u STRICT
display\u errors=On
@Boogie Man:你没有收到关于此代码的通知/警告吗?没有,我没有收到任何错误和/或警告这对
$obj->存在(“cat”、“item1”、“item2”)有效吗
->
$array['item1']['item2']
?@布吉人:如果你在问之前先试试怎么办?@布吉人它不会创建数组元素;对于名为
exists()
的函数,我无论如何都不会期望出现这种副作用。@Ja͢ck但为什么不同时使用
isset
呢?我在if语句中添加了
&&array\u key\u exists($key,$ref)
,因为它说索引“cart”不存在。加上这个是个好主意吗?
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);
}