PHP には、shuffle
という関数が用意されています。配列の順序をランダムに並べ替える関数ですが、連想配列にするとキー値の対応が保存されません。
連想配列をシャッフルする方法を探したところ、公式マニュアルを読むと、andjones さんの投稿に、
function shuffle_assoc($list) { if (!is_array($list)) return $list; $keys = array_keys($list); shuffle($keys); $random = array(); foreach ($keys as $key) $random[$key] = $list[$key]; return $random; }
というのがありました。なので、この関数についてテストしてみました。
class ShuffleAssocTest extends PHPUnit_Framework_TestCase { private $array = array(); private $array_shuffled = array(); public function setUp() { $this->array = array( 'akey' => 'aval', 'bkey' => 'bval', 'ckey' => 'cval', 'dkey' => 'dval', ); $this->array_shuffled = shuffle_assoc($this->array); } public function testLengthPreserved() { // 配列の長さが保存されるか $this->assertEquals(sizeof($this->array_shuffled), sizeof($this->array)); } public function testKeysPreserved() { // シャッフル後、キーが保存されるか foreach ($this->array as $key => $val) { $this->assertArrayHasKey($key,$this->array_shuffled); } } public function testValuesPreserved() { // シャッフル後、キー値の対応が保存されるか foreach ($this->array as $key => $val) { $this->assertEquals($val,$this->array_shuffled[$key]); } } }
ランダムに並べかえられたことの直接のテストではありませんが(ここを上手くテストする方法があれば教えてください)、この関数で処理しても、配列の要素がきちんと並んでいることが確認できました。
PHPUnit では、xDebug 拡張を利用してコードカバレッジをチェックできるようです。