2013年06月14日 / ホームページ
【PHP】多次元配列のランダム
PHPにはランダムにする方法がいくつかあり簡単にできます。
もし下記のような多次元配列があり、
- キー毎にシャッフルを行いたい
- シャッフル後繋げて表示したい
という場合を考慮してみました。
array(
'MsgBox' => array(
'line' => '1',
'message' => '1行目に表示①'
)
),
(int) 1 => array(
'MsgBox' => array(
'line' => '1',
'message' => '1行目に表示②'
)
),
(int) 2 => array(
'MsgBox' => array(
'line' => '2',
'message' => '2行目に表示①'
)
),
(int) 3 => array(
'MsgBox' => array(
'line' => '2',
'message' => '2行目に表示②'
)
)
);
?>
結構特殊なランダムですが、よくあるかと思いますので覚書のため…
<?php
/** メッセージをシャッフル */
function msgContent($msgBoxs){
$i = 0;
$ii = 0;
$bmiMsg = "";
$line = array();
$br = '';
/** メッセージを取得後、各行(line)毎に配列に追加 */
foreach ($msgBoxs as $msgBox){
// 配列を取得
$messages = $msgBoxs[$i]['MsgBox']['message'];
$lineDb = $msgBoxs[$i]['MsgBox']['line'];
// 変数($line)があるか判定
if(is_array($line)){
$lineEnd = end($line);
}else{
$lineEnd = 0;
}
// 行(line)が変った場合は配列のインデックスを変更
if($i == 0){
$line[0] = $lineDb;
}else{
if($lineEnd != $lineDb){
$line[$i] = $lineDb;
$ii++;
}
}
// 行(line)毎に分けて配列に追加
$msg[$ii][$i] = $messages. $br;
$i++;
}
/** 作成した配列を各行毎にシャッフルする */
$msgs = "";
$count = count($msg);
for($a = 0; $a < $count; $a++ ){
if(is_array($msg[$a])){
$msgcount = count($msg[$a]);
$msgrand = array_rand($msg[$a]);
if(isset($msg[$a][$msgrand])){
$msgs = $msgs. $msg[$a][$msgrand];
}
}
}
return $msgs;
}
上記のメソッドを呼び出して表示してみました。
もう少しコードを減らすことができそうかなっと思っています。