Q1.配列を用いて以下のように出力せよ。

[解答例]

<?php
$data=['山田','田中','石井','松本'];
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>PHPLesson</title>
</head>
<body>
<ol>
<?php foreach($data as $val):?>
<li><?= $val?></li>
<?php endforeach;?>
</ol>
</body>
</html>

[解説]
php5.4は現在安心使えるバージョンである。そして多くの嬉しい機能が使える。(現場では5.3以下も多く存在しているのでリニューアルなどの場合は要注意)
●配列

$data=['山田','田中','石井','松本'];
$data[1] //->田中

jsでおなじみの[]での配列宣言が5.4からできるようになった。これは嬉しい。
5.3以下の場合は$data=array(‘山田’,’田中’,’石井’,’松本’);とメソッドを使って生成する必要がある。
●foreach

foreach($data as $val){}

配列の走査を普通の

for($i=0;$i<count($data);$i++){}

を使って書くこともできるが全件取得であればforeachが便利だ。今回は配列の要素一つ一つを$valとして受け取り処理している。
●開きカッコ閉カッコの変更

foreach($data as $val):
endforeach;

開き波カッコ「{」をコロン「:」、閉じ波括弧「}」を「endforeach;」に変更することができる。こうすることによってソースコードがみやすくなる。これが使えるのはif、 while、for、 foreach、switch。
以下はifの例。(elseifであることに注意してもらいたい。通常elseifでもelse ifでもどちらでも使えるがこの記法使った場合はelseifしか使えない)

<?php
if ($a == 5):
    echo "aは5に等しい";
    echo "...";
elseif ($a == 6):
    echo "aは6に等しい";
    echo "!!!";
else:
    echo "aは5でも6でもない";
endif;
?>

●省略記法の正式採用

<?= $val?>

これは

<?php echo $val; ?>

これとまったく同じ意味だ。古くから使えていたが非推奨だった。ただ5.4から正式採用となっている。非常によく使う処理だし、省略できる量も多い。5.4になって嬉しい変更の一つだ。

Q2.日付を入力するとその日までの後何日かを表示するアプリを作成せよ。

ページリフレッシュ

[解答例]
●index.php

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>PHPLesson</title>
</head>
<body>
<?php if(isset($_POST['date'])){
$date=strtotime($_POST['date']);
$today=time();
$interval=ceil(($date-$today)/(24*60*60));
echo "今日は".date("Y-m-d",$today)."<br>";
echo "予定日は".date("Y-m-d",$date)."<br>";
echo "あと{$interval}日です。";
}else{
?>
<form method="post">
  <p>日付を入力してください。</p>
  <input type="date" name="date">
  <button type="submit">送信</button>
</form>
<?php
}
?>
</body>
</html>

[解説]

strtotime($_POST['date']);

strtotime(日付文字列)でその文字列からUnixタイムを返す。

日付文字列の例

  • “2017:10:27 12:34:56”
  • “2017-10-27”
  • “yesterday”
  • “next sunday”
time()

現在のUnixタイムを返す。

date("Y-m-d",$today)

第2引数のUnixタイムを第1引数の書式で変換した文字列を返す。

書式の例

例1)

$date = '2017-10-27 00:00:00';
echo date('Y年n月j日', strtotime($date));

結果

2017年10月27日

例2)

$date = '2017-10-27 00:00:00';
echo date('w', strtotime($date));

結果

5 //日曜(0)~土曜(6)

例3)

$date = '2017-10-27 00:00:00';
echo date('t', strtotime($date));

結果

31 //その月の日数

課題

アプリを実行した月のカレンダーを表示するアプリを作成せよ。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>PHPLesson</title>
<style>
ul{
  list-style-type:none;
}
li{
  border-bottom:1px solid #ddd;
}
ul .sat{
  background: aqua;
}
ul .sun{
  background: pink;
}
</style>
</head>
<body>
<?php
//ini_set( 'display_errors', 1 );
$week=['日','月','火','水','木','金','土'];
$time=time();
$year=date('Y',$time);
$month=date('m',$time);
$total=(int)date('t',$time);
?>
<h1><?=$year.'年'.$month.'月'?></h1>
<ul>
<?php
for($i=1;$i<=$total;$i++){
  $w=(int)date('w',strtotime($year.'-'.$month.'-'.$i));
  $class='';
  if($w===0){
    $class='sun';
  }else if($w===1){
    $class='sat';
  }
  echo "<li class='{$class}'>{$i}日({$week[$w]})</li>\n";
}
?>
</ul>
</body>
</html>