PHP:检查对象/数组是否为引用

lep*_*epe 15 php arrays reference pass-by-reference

很抱歉问,它已经迟到了,我无法想办法......任何人都可以帮忙吗?

$users = array(
    array(
        "name" => "John",
        "age"   => "20"
    ),
    array(
        "name" => "Betty",
        "age"   => "22"
    )
);

$room = array(
    "furniture" => array("table","bed","chair"),
    "objects"   => array("tv","radio","book","lamp"),
    "users" => &$users
);
Run Code Online (Sandbox Code Playgroud)

var_dump $ room显示:

...
'users' => &
...
Run Code Online (Sandbox Code Playgroud)

这意味着"用户"是一个参考.

我想做这样的事情:

foreach($room as $key => $val) {
    if(is_reference($val)) unset($room[$key]);
}
Run Code Online (Sandbox Code Playgroud)

主要目标是复制数组而不引用任何引用.

那可能吗?

谢谢.

Chr*_*ris 7

您可以通过复制数组来测试多维数组中的引用,然后依次更改和测试每个条目:

$roomCopy = $room;
foreach ($room as $key => $val) {
  $roomCopy[$key]['_test'] = true;
  if (isset($room[$key]['_test'])) {
    // It's a reference
    unset($room[$key]);
  }
}
unset($roomCopy);
Run Code Online (Sandbox Code Playgroud)

使用您的示例数据,$room['furniture']并且$roomCopy['furniture']将是单独的数组(作为$roomCopy副本$room),因此向其中添加新密钥不会影响另一个.但是,$room['users']并且$roomCopy['users']将引用相同的$users数组(因为它是复制的引用,而不是数组),所以当我们添加一个键时,$roomCopy['users']它是可见的$room['users'].