クロピグログ

職業訓練で学んだことまとめ

【PHP授業三日目】連想配列、演算子

f:id:chromiumpig:20200902103911p:plain

配列(補足)

// 商品リスト
$productList = [
  [
    'ノート',
    '../img/item0.png',
  ],
  [
    'はさみ',
    '../img/item1.png',
  ],
  [
    '計算機',
    '../img/item2.png',
  ],
];
// ナビリスト
$navList = [
  'ノート',
  'はさみ',
  '計算機',
];
// 掲載商品No
$productNo = mt_rand(0count($productList) - 1);
mt_rand関数:乱数関数
第1引数:最小値「0」
第2引数:最大値「変数productListの部屋数-1」
戻り値:最小値以上最大値以下のランダムな整数

 ・こういう書き方なら、サイト読み込み時ランダムで画像パスと名前変わる

 

連想配列

・部屋に好きな名前や数値を使用可能

・名前の付けた部屋を「キー」と呼ぶ

f:id:chromiumpig:20200902110230p:plain

    $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 = [
    36 => '徳島市',
    37 => '高松市',
    38 => '松山市',
    39 => '高知市',
  ];
  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(03);  ←これだと配列が増えた時に対応できない
  第2引数を配列の最後の数値にするためにcount関数で配列の数取得後-1する
  $randomNam = mt_rand(0count($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($money22PHP_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