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;
	}

 

上記のメソッドを呼び出して表示してみました。

 

 

もう少しコードを減らすことができそうかなっと思っています。