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 拡張を利用してコードカバレッジをチェックできるようです。
