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」を 2 回返し、「chrome」を省略したり、他のクライアントではその逆を行ったりすることがあります。var_dump と foreach ループを近くに置いて、それらが同じであり、2 つのコマンド間でオブジェクトに変更がないことを確認しようとしましたが、実際に何が起こっているのかわかりませんでした。

何か助けはありますか?前もって感謝します。

4

2 に答える 2

1

safari が配列への参照であることに注意してください: &array.

これは、$obj が参照である foreach が原因である可能性があります。

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

PHP では、$obj のスコープはループの実行で終了しないため、参照を使用してループするたびに unset を実行する必要があります。

これは、どこかで参照割り当てを使用した結果である可能性もあります。

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

これは2つの差分コードです...1つは&配列出力を変更する参照を使用しており、もう1つはそうではありません

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 

ニックが変更された場合、2つではなく1つがわかりますか

于 2012-11-23T15:27:33.297 に答える