PHP var_dump和循环给出不同的结果

时间:2012-11-23 15:01:15

标签: php foreach var-dump

我有以下代码:

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循环放在一起,以确保它们是相同的,并且两个命令之间的对象没有变化,但实际上我不知道发生了什么。

有任何帮助吗?提前谢谢。

2 个答案:

答案 0 :(得分:1)

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

这可能是因为有一个foreach,其中$ obj是一个参考:

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

在PHP中,$ obj的范围并不以循环的执行结束,因此每当使用引用循环时都应该取消设置。

这也可能是因为在某处使用了引用分配:

$cursor[] =& $safari;

答案 1 :(得分: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 

如果尼克被修改而不是两个

,你能看到一个吗?