PHPを使用していて、配列の中身をランダムに入れ替えたい場合がありました。
ここで普通にすればエラーが出てしまったので、覚書しておきます。
PHPのshuffleで配列をランダムに入れ替えたい場合の基礎と間違い例がわかります。
実際にあった例を用いて説明します。
PHPでshuffleを使いこなせるようになりましょう!
shuffleで配列の中身をランダムにシャッフルする
PHPのshuffleの基本構文
shuffleの基本構文を以下に示す。
shuffle($配列);
shuffle(配列)で簡単ですね。
配列の中身をランダムに入れ替えてくれます。実際に行ってみましょう。
shuffleで配列の中身をランダムにシャッフルする 実践編
配列を作成
例えば以下の配列を作成します。
$jyunban = array(1,2,3,4,5,6,7,8);
$jyunbanという配列に1から8までの数字を入れています。
配列の中身をシャッフルする
それをシャッフルして見ましょう。以下のコードを追記します。
shuffle($jyunban);
ではこれを使って、シャッフルした配列の中身を順に表示して見ます。
※正解のコードだけを見たい場合は「まとめ」の「まとめ:shuffleで配列の中身をランダムにシャッフルする」に飛んでください。
以下のコードを記入して、表示して見ます。
shuffleの実践の結果
エラーが出ました!この構文ではエラーが出ます!
<?php
$jyunban = array(1,2,3,4,5,6,7,8);
$shuffles = shuffle($jyunban);
foreach($shuffles as $shuffle){
echo $shuffle;
}
?>
エラーの構文の手順
エラーのコードの詳細を以下に示す。
- 配列を作成します。
- shuffleで中身をランダムに入れ替えて配列に入れます。
- foreach構文でシャッフルした配列の一つ一つを取り出します
- 配列の最後まで順に表示します。
foreachは配列の中身を繰り返し取得するメソッドです。詳しくは下記の記事からどうぞ。
以下のようなエラー文が出力されました。
Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\shuffle\index.php on line 4
4行目なのでforeachの部分ですね。
エラーの原因を探る
以下のコードを追記して、表示して見ます。
var_dump($shuffles);
var_dumpは配列の種別なども表示してくれます。配列系のエラーが出た時は、var_dumpなどで確認して見ましょう。
すると結果は以下となりました。
エラーの原因とは?
bool(true)
boolになっていますね。
shuffleは戻り値を返します。シャッフルに成功したらboolの1、失敗したらboolの0を返します。
エラー回避コード
ではどうするのかというと以下でした。
<?php
$jyunban = array(1,2,3,4,5,6,7,8);
shuffle($jyunban);
foreach($jyunban as $jyunban_value){
echo $jyunban_value;
}
?>
表示した結果は以下になりました。想定通りの結果になりました。
38672541
エラーの手順を訂正する
- 配列を作成します。
shuffleで中身をランダムに入れ替えて配列に入れます。←ダメ- foreach構文でシャッフルした配列の一つ一つを取り出します
- 配列の最後まで順に表示します。
配列にはboolの値が入りますので、配列はそのままで良いです。手順は以下となります。
- 配列を作成します。
- shuffleで中身をランダムに入れ替える。←良い
- foreach構文でシャッフルした配列の一つ一つを取り出します
- 配列の最後まで順に表示します。
エラーが起きた部分のおさらい
③のforeachの部分の配列は、最初に作成した配列をいれればOK
②のシャッフルした時点で、その配列は作成時の並び順ではなくなっているのですね。
少しはまったので、覚書しておきました。
まとめ:shuffleで配列の中身をランダムにシャッフルする
PHPで配列の中身をシャッフルしたい場合は以下を使用する。
shuffle($配列);
シャッフルしたら戻り値は配列ではなくboolになる。値はシャッフル成功で「1」、失敗で「0」を返す。
シャッフルされた配列は元の配列「$配列」に入っている。
配列を作成して、シャッフルして一つ一つ表示するPHPコマンドは以下になります。
<?php
$jyunban = array(1,2,3,4,5,6,7,8);
shuffle($jyunban);
foreach($jyunban as $jyunban_value){
echo $jyunban_value;
}
?>