0

我有以下代码:

var_dump($cursor);
foreach($cursor as $obj) {
    echo "<div class='item' id='" . $obj['_id'] . "'>";
        echo "<span class='listnick'>" . $obj['nick'] . "</span>";
    echo "</div>";
}

var_dump 的结果如下:

array(2) {
  [0]=>
  &array(9) {
    ["_id"]=>
    object(MongoId)#9 (1) {
      ["$id"]=>
      string(24) "50af8dcd9cc231534400000c"
    }

    ["nick"]=>
    string(6) "safari"

  }
  [1]=>
  array(9) {
    ["_id"]=>
    object(MongoId)#8 (1) {
      ["$id"]=>
      string(24) "50af8dca9cc2315644000009"
    }
    ["nick"]=>
    string(6) "chrome"
  }
}

所以很明显foreach应该打印出“safari”和“chrome”,但问题真的很奇怪:

有时它会返回两次“safari”并省略“chrome”,反之亦然。我尝试将 var_dump 和 foreach 循环放在附近,以确保它们是相同的,并且两个命令之间的对象没有变化,但我真的不知道发生了什么。

有什么帮助吗?提前致谢。

4

2 回答 2

1

请注意 safari 是如何引用数组的:&array。

这可能是因为有一个 $obj 是引用的 foreach:

foreach($cursor as &$obj) {
   ..
}
//unset($obj);

在 PHP 中,$obj 的作用域不会随着循环的执行而结束,因此每当您使用引用进行循环时,您都应该取消设置。

这也可能是由于在某处使用了引用分配:

$cursor[] =& $safari;
于 2012-11-23T15:21:50.823 回答
0

这是 2 个不同的代码......一个是使用&参考,它会修改数组输出,另一个不是

array(2) {
  [0]=>
  &array(9) {
  ^----------------------------- Reference sign 
    ["_id"]=>
    object(MongoId)#9 (1) {
      ["$id"]=>
      string(24) "50af8dcd9cc231534400000c"
    }

    ["nick"]=>
    string(6) "safari"

  }

发生的事情的典型例子

$a = $b = array(array("_id" => new MongoId(),"nick" => "chrome"));

foreach ( $a as $k => &$v )
    $k == "nick" and $v['nick'] = "Safari";

foreach ( $b as $k => $v )
    $k == "nick" and $v['nick'] = "Safari";

var_dump($a);
var_dump($b);

输出

array (size=1)
  0 => 
    &array (size=2)
      '_id' => 
        object(MongoId)[1]
          public '$id' => string '50af93a2a5d4ff5015000011' (length=24)
      'nick' => string 'Safari' (length=6) <------ changed

array (size=1)
  0 => 
    array (size=2)
      '_id' => 
        object(MongoId)[2]
          public '$id' => string '50af93a2a5d4ff5015000012' (length=24)
      'nick' => string 'chrome' (length=6) <------- not changed 

如果修改了尼克而不是两个,你能看到那个吗

于 2012-11-23T15:27:33.297 回答