我有以下代码:
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循环放在一起,以确保它们是相同的,并且两个命令之间的对象没有变化,但实际上我不知道发生了什么。
有任何帮助吗?提前谢谢。
答案 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
如果尼克被修改而不是两个
,你能看到一个吗?