1

配列のネストされた配列があり、内部配列をシャッフルしたいと思います。私のコードは次のようになります(簡略化):

$a = array(array('banana', 'peach'), array('ding', 'dong'), array('oh snow'));
foreach ($a as &$arr) {
    shuffle($arr);
}
var_dump($a);

var_dumpはこれを出力します:

array(3) { [0]=> array(2) { [0]=> string(5) "peach" [1]=> string(6) "banana" } [1]=> array(2) { [0]=> string(4) "ding" [1]=> string(4) "dong" } [2]=> &array(1) { [0]=> string(7) "oh snow" } } 

出力でわかるように、最初の2つのサブアレイは機能しますが、3番目のサブアレイは出力で参照によってリンクされています...

私の完全なアプリでは、この最後の配列リンクが問題を引き起こしますが、問題を回避するのではなく、このシャッフルの問題を修正したいと思います...

乾杯!

4

1 に答える 1

2

これは、PHPが配列要素への参照を格納する方法と関係があります。配列の要素を参照することはできず、値のみを参照します。したがって、値array('oh snow')をシンボルテーブルの「スロット」に格納してから、その値への参照を作成$arrする$a[2]必要があります。

これを修正するunset($arr)には、ループの後で。そうすれば、1つの変数だけが値を参照し、その値は再び通常の配列インデックスになります。foreachそのような落とし穴がたくさんあるので、とにかくaの後に参照を設定解除することは良い習慣です。

于 2012-07-04T14:14:30.537 に答える