配列(補足)
// 商品リスト
$productList = [
[
'ノート',
],
[
'はさみ',
],
[
'計算機',
],
];
// ナビリスト
$navList = [
'ノート',
'はさみ',
'計算機',
];
// 掲載商品No
$productNo = mt_rand(0, count($productList) - 1);
mt_rand関数:乱数関数
第1引数:最小値「0」
第2引数:最大値「変数productListの部屋数-1」
戻り値:最小値以上最大値以下のランダムな整数
・こういう書き方なら、サイト読み込み時ランダムで画像パスと名前変わる
・部屋に好きな名前や数値を使用可能
・名前の付けた部屋を「キー」と呼ぶ
$items = array(
'f-001' => 'りんご',
'f-002' => 'みかん',
'd-001' => '水',
'd-002' => 'コーラ',
);
echo $items['f-001'];
echo '<br>';
echo $items['f-002'];
echo '<br>';
echo $items['d-001'];
echo '<br>';
echo $items['d-002'];
echo '<br>';
echo count($items);
・JSでいう「オブジェクト」
・「オブジェクト」はlength使えないので部屋数取得できない
・PHPは連想配列でもcount関数があるので部屋数を取得できる
●問題
四国の県庁所在地を連想配列で管理
キー:県番号
バリュー:県庁所在地
四国の県庁所在地をすべて表示すること
$shikoku = [
];
echo $shikoku[36] . '<br>';
echo $shikoku[37] . '<br>';
echo $shikoku[38] . '<br>';
echo $shikoku[39] . '<br>';
----------------------------------------------------------------------------------------------------------------------
<?php
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array);
?>
上の例の出力は以下となります。
array(1) {
[1]=>
string(1) "d"
}
※↑公式記述https://www.php.net/manual/ja/language.types.array.php
----------------------------------------------------------------------------------------------------------------------
●問題1
ランダムに画像表示
$imgList = [
[
'src' => 'img/b001.jpg',
'alt' => 'DPH'
],
[
'src' => 'img/b002.jpg',
'alt' => 'ねこにゃん'
],
[
'src' => 'img/b003.jpg',
'alt' => 'もんちゃん'
],
[
'src' => 'img/b004.jpg',
'alt' => '部屋'
],
];
画像選択用の乱数生成
$random = mt_rand(0, 3); ←これだと配列が増えた時に対応できない
第2引数を配列の最後の数値にするためにcount関数で配列の数取得後-1する
$randomNam = mt_rand(0, count($imgList) - 1);
echo '<img src="../' . $imgList[$random]['src'] .
'" alt="' . $imgList[$random]['alt'] . '">';
●問題2
3枚のスロット作成
画像が揃ったら「あたり」揃わなければ「はずれ」
$random1 = mt_rand(0, count($imgList) - 1);
$random2 = mt_rand(0, count($imgList) - 1);
$random3 = mt_rand(0, count($imgList) - 1);
echo '<img src="../' . $imgList[$random1]['src'] .
'" alt="' . $imgList[$random1]['alt'] . '">';
echo '<img src="../' . $imgList[$random2]['src'] .
'" alt="' . $imgList[$random2]['alt'] . '">';
echo '<img src="../' . $imgList[$random3]['src'] .
'" alt="' . $imgList[$random3]['alt'] . '">';
if ($random1 === $random2 && $random1 === $random3) {
echo '<h2>あたり</h2>';
} else {
echo '<h2>はずれ</h2>';
}
別解
for ($i = 0; $i < 3; $i++) {
$random = mt_rand(0, count($imgList) - 1);
echo '<img src="../' . $imgList[$random]['src'] .
'" alt="' . $imgList[$random]['alt'] . '">';
$list = $random; ←配列に入れて後でifでチェックする
}
if ($list[0] == $list[1] && $list[0] == $list[2]) {
echo '<h2>あたり</h2>';
} else {
echo '<h2>はずれ</h2>';
}
・JSとほど同じ
・大きな違いは文字列用で分かれている
文字列連結代入演算子:.=
加算代入演算子:+=
●算術演算子(PHPで文字列を使った計算は注意)
echo '答えは' . 4 + 2 . '<br>'; ←エラーになる
・'答えは' . 4 → '答えは4'
・'答えは4' + 2 → 「足し算しようとする」
・文字列「'答えは4'」のデータ型を数値型に変更
・結果
0 + 2 → 2
2 . '<br>' → '2<br>'
「Warningエラーでる」
◇豆知識
PHP8にバージョンアップしたら、この問題は起きなくなる
「+,-」を「.」より優先的に処理するようになるらしい
●文字列を数値型に変更する際のルール
echo '文字列' + 10; //0+10=10[エラーでる]
echo '<br>';
echo '文字列5' + 10; //0+10=10[エラーでる]
echo '<br>';
echo '5文字列' + 10; //5+10=15[エラーでる]
echo '<br>';
echo '5' + 10; //5+10=15
・文字列内に数値がない → 0
・文字列内の先頭以外に数値がある → 0
・文字列内の先頭に数値がある → 先頭にある数値を使用する 例)'10ですよ' → 10
・文字列で数字「'5'」はエラーにならない、PHPが数字に変換してくれる
●少数点の処理
$price = 198;
$tax = 0.1;
$total = $price * (1 + $tax);
echo '<p>税込金額(切り上げ):' . ceil($total) . '円</p>';
echo '<p>税込金額(四捨五入):' . round($total) . '円</p>';
echo '<p>税込金額(切り捨て):' . floor($total) . '円</p>';
・round関数:丸め処理をする(細かい数字(尖がり)を削って丸くする)
・round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] ) : float
・関数名( データ型 説明用名称 ):戻り値の型
・で囲まれた引数は省略可能
・省略可能引数:[int $precision = 0]
・[データ型 説明用名称 = 値(省略時に採用される値)]
・第1引数(float:小数):丸める値
・第2引数(int:整数):丸める桁の位置(正も負も指定可能)
・省略可:0桁(整数)になるように丸め
・第3引数(int:整数):丸めモード
・省略可:PHP_ROUND_HALF_UP(四捨五入)
・PHP_ROUND_HALF_UPは定数で中にint型の整数が入ってる
・戻り値(float:小数):丸め処理後の値
・round( 123.456 , 2 , 1 )これもできるけど
・round( 123.456 , 2 , PHP_ROUND_HALF_UP )こっちのほうが視覚的
● 問題1
様々な数値を使って1000円単位で表示
丸め処理は四捨五入
$money = 1480;
echo '<p>1000円単位表示:' . round($money, -3) . '円</p>';
● 問題2
様々な数値を使って小数点以下第2位で表示されるようにすること
丸め処理は偶数丸め
※小数点以下が0になった場合に省略OK
$money2 = 5480.225;
echo '<p>小数点以下第2位表示:' . round($money2, 2, PHP_ROUND_HALF_EVEN) . '円</p>';
偶数丸めの例
0.016 0.02
0.015 0.02
0.014 0.01
0.026 0.03
0.025 0.02
0.024 0.02