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

<?php
$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と書くことでメンバーの最大数を表すことができるからである。