PHP復習4
前回の続き。PHP入門編4。今回は配列の基礎、explodeを学びます。
■配列について
・array関数
array("要素1","要素2","要素3...")
様々な要素を配列に加えることができる。また、変数や数字も要素として代入できる。
・print_r関数
print_r(変数)
配列の中身をすべて出力する。配列だけではなく、変数の中身も出力できる。配列の中身を確認する、デバッグでの利用がメインになる。
・添字(key番号)
配列に入れたものは、自動的に添字が振られる。番号は0から始まる。
例1
<?php
$name1 = くま;
$team = array("ムササビ", "モルモット", $name1, 28);
print_r($team);
?>
出力
Array
(
[0] => ムササビ
[1] => モルモット
[2] => くま
[3] => 28
)
・特定の要素のみを出力したい場合
echo 配列[添字];
print_rではなくechoを使う。例1のプログラムでくまだけを出力したいなら、echo $team[2];となる。
■配列の要素の追加、上書き、削除方法
・追加
変数[] = 要素名
複数追加したい場合、その文を上記の追加式を書けば追加される。また、array関数で配列への代入を行っていなかった場合でも、この追加式だけ配列は生まれる。それが例2になる。
例2
$nuigurumi[] = "パンダ";
$nuigurumi[] = "猫";
$nuigurumi[] = "ネズミ";
print_r($nuigurumi);
出力
Array
(
[0] => パンダ
[1] => 猫
[2] => ネズミ
)
・上書き
変数[添字] = 上書きしたい要素名
例2のプログラムでkey番号1を犬に変えたい場合、$nuigurumi[1] = "犬";を追加すれば上書きされる。
・削除
unset(変数[削除したい添字])
上書き同様、例2のプログラムで猫を削除したい場合、unset($nuigurumi[1])を追加すれば削除される。その際の出力は下記のようになる。
出力
Array
(
[0] => パンダ
[2] => ネズミ
)
このように、unsetを使って要素を削除した場合、指定した添字が歯抜けになってしまう。0,1...のように、自動的に繰り上がりはしないので注意。
■文字列の分割、集計
・explode関数
配列名 = explode("分割に使用する文字", 分割したい文字列)
文字列を特定の文字で分割し、配列に格納する。例えば、CSVのようにカンマ区切りのデータがあった場合、カンマで分割し、配列に代入する、ということができる。
例3
入力
がじゅまる,パキラ,ヘデラ
<?php
$input = trim(fgets(STDIN));
$plant = explode(",", $input);
print_r($plant);
?>
出力
Array
(
[0] => がじゅまる
[1] => パキラ
[2] => ヘデラ
)
このように、カンマが区切られた形で配列に代入される。例えば入力が/で区切られていた場合、$plant = explode(",", $input);を$plant = explode("/", $input);にすることで同様の処理がされる。
・集計
echo count(変数)
指定した変数の要素数を出力することができる。例3のプログラムにecho count($plant);を追記した場合、出力に3が追加される。
■データの格納
標準入力で与えられたデータを配列に格納する方法。標準入力が何行かわからない場合でも、すべての行を所得する方法。
・標準入力からデータが取得できる限りループする(入力が空になるまで)
例4
入力
コーヒー
シルバースター
<?php
$input = trim(fgets(STDIN));
while($input){
$plant2 = $input;
$input = trim(fgets(STDIN));
}
print_r($p;ant2);
?>
出力
Array
(
[0] => ローズマリー
[1] => コーヒー
[2] => シルバースター
)
これで、標準入力のすべてのデータが格納された、となる。
・取得途中に空白(改行)があった場合の格納方法
入力
コーヒー
シルバースター
例4のプログラムの場合、上記入力のように空白(改行)があった場合、ループが3行目に入った時点で空白と判断し、処理を止めてしまう。なぜなら、標準入力の処理の部分にtrim()を使っている為、改行を取り除いてしまっているからである。なので、データを取得する際ではなく、配列に代入される際にtrim()を使う。それが例5になる。
例5
入力
コーヒー
シルバースター
<?php
$input = fgets(STDIN);
while($input){
$plant2 = trim($input);
$input = fgets(STDIN);
}
print_r($p;ant2);
?>
出力
Array
(
[0] => ローズマリー
[1] => コーヒー
[2] =>
[3] => シルバースター
)
このように記述することで、空白でもループ処理を終えず、最終行まで値を取得できる。
・よりスマートに書くには
例5のプログラムの場合、入力データを取得する同一のコードが2箇所入っている。これをwhile文の受験式の部分に代入することにより、同様の処理・出力が得られる。
例6
<?php
while($input = fgets(STDIN)){
$plant2[] = trim($input);
}
print_r($p;ant2);
?>
■応用
・配列を使ったランダムくじ引き
以前書いたrand変数を使ったくじ引きと違い、参加人数が変わった場合でもrand変数が可変する、というプログラムの書き方。
入力
くま
モルモット
ムササビ
猫
犬
ネズミ
<?php
$input = trim(fgets(STDIN));
$member = explode(",", $input);
$max - count($member)-1;
$key = rand(0,$max);
echo $member[$key];
?>
出力
入力内の誰か
プログラム4行目で、配列に含まれる数字-1と書いている。これは、配列が0から始まるのに対し、入力人数のカウントが1から始まる、つまりcount($member)-1と書くことでメンバーの最大数を表すことができるからである。