PHPの備忘録です。間違っていたらすみません。
- 事前知識
- 基礎
- 変数と定数
- 型
- 四則演算
- 条件文
- ループ文
- 関数類
- 絶対値を返す abs
- 小数点以下を切り捨て floor
- 小数点以下を切り上げ ceil
- 整数の下2桁を切り捨てする(割引)
- ROUNDDOWNする
- 大文字に変換 strtoupper
- 文字の切り出し substr
- 文字の出現数のカウント substr_count
- 配列の値の数を数える array_count_value
- 何文字目にあるかを探す strpos、mb_strpos
- 指定文字が含まれるかどうか str_contains
- 文字列から数字だけを取り出す preg_replace
- 2進数を10進数に変換する bindec
- 10進数を2進数に変換する decbin
- 行の先頭や行末のスペースを取り除く trim
- ランダム値を取得する rand
- ランダムを取得する mt_rand
- 四捨五入 round
- 小数の桁を指定して表示する number_format
- 文字の置換 str_replace
- 位置と桁数を指定して置換 substr_replace
- 指定した文字数で文字列を改行する wordwrap
- 文字列を反転させ逆順にする strrev
- 文字数の長さ strlen、mb_strlen
- 数字の先頭を0で桁埋め sprintf
- 数字の0埋め str_pad
- 配列から最大値/最小値 max/min
- 連想配列でmaxとmin
- 連想配列でカウント
- 文字列を数値・整数に変換する
- 10進数を2進数に変換する
- 配列から先頭の要素を取り出す array_shift
- 配列の末尾から要素を取り除く array_pop
- 配列の先頭を後方に移動し、元ある要素を左にずらす
- 配列の最後を先頭に移動し、元ある要素を右にずらす
- 配列の先頭の要素に挿入し右にずらす。array_unshift
- 配列の最後の要素の後ろに挿入する array_push
- 配列の重複した要素を削除する array_unique
- 配列の中身が全て同じか調べる array_unique&count
- 文字列と数字数値の判定
- 関数
- 配列
- 配列とは
- 配列の初期化
- 作り方① ひとつづつ順番に値を代入していく
- ②ひとつづつキー名を指定して要素を作る
- ③カギカッコで代入
- ④array関数を使う方法(インデックス配列の場合)
- ⑤array関数を使う場合(連想配列の場合)
- ⑥explodeで分割して放り込む
- ⑦文字列からstr_spritで流し込む
- 配列の中身をすべてわかりやすく表示する
- 配列に配列の値を追加する
- 要素の削除
- 配列の要素数 count
- 配列を使ったランダムくじびき
- N数分、配列を準備する。(席数確保例)
- 配列の並び替え(昇順)sort
- 配列の並び替え(降順)rsort
- 配列の数値を合計する array_sum
- 配列の数値を乗算する array_product
- 配列の数値の平均を出す
- 配列の中に特定の値が含まれているか in_array
- 配列に特定の値が含まれているかindexを返す array_search
- 配列に特定の値が含まれているかindexを返す array_keys
- 連想配列
- 二次元配列
- 日付
- 便利関数
- その他
事前知識
文字コード
PHPはUTF-8N(ボムなし)で保存する。BOMはByte Order Markの略称。
改行コードはLinuxに入れる場合はLFで。
- LF(UNIX.Linux.MacOS)
- LF+CR(Windows)
文字化けが起きたとき調べるところ
1.PHPファイルを保存したときの文字コード
2.PHPファイル内で指定した文字コード(meta charset)
3.サーバ内の文字コード
4.PHPインタプリタ内の文字コード
5.表示するブラウザの文字コード
エスケープシーケンス
これを知っておかないと「It’s」などのシングルクォーテーションを使う文字や、ダブルクォーテーションの中でダブルクォーテーションを使う場合に表現できない。
バックスラッシュはMacの場合「Option+¥」で出せる。
\n 改行 \t タブ \\ バックスラッシュ \$ ドル記号 \" ダブルクォーテーション \' シングルクォーテーション
基礎
コメントアウト
// 行末までがコメント # 行末までがコメント /* この間がコメント */
文字の結合
文字や変数をつなげるときはドットでつなぐ
echo "hello"." "."world"; //hello world
ヒアドキュメント
あまり使いどころはわからないけど、改行や字下げが保持される。
終端記号はEOTでなくても構わない。
’EOT’とすれば変数は展開されない、ナウドキュメント。”EOT”にすれば変数を埋め込める、ヒアドキュメント。
$name = 'kouji'; $text = <<<"EOT" Hi! $name 書いたテキストが 代入される EOT;
エスケープ処理(サニタイジング)
別名サニタイジング(消毒、無毒化)。この処理をしておかないと、ユーザーから受け取った文字列がそのままブラウザに展開されてしまうので、不正なコードを実行させられてしまう。
// 下記は < > & " のエスケープだけ htmlspecialchars($_GET('hoge')); // 下記は < > & " プラス シングルクォーテーション'も含めてエスケープ htmlspecialchars($_GET('hoge'),ENT_QUOTES); // 基本的にはこれ。文字コードも指定してあげること htmlspecialchars($_GET('hoge'),ENT_QUOTES,'UTF-8');
変数と定数
変数名の決まり
・変数の前には$をつける
・一文字目は半角アルファベットか半角アンダースコア
・二文字目は半角アルファベットか半角アンダースコアか半角数字
・アルファベットの大文字・小文字は区別される。
・ハイフンは使えない
・変数名の後ろは半角スペースをあける。空けたくない場合は{}で括る。
$name = 'kouji';
定数を定義 const
定数は$を付けてはいけない。慣習的に定数名は大文字で書くこと。
const TAX = 1.1
定数を定義 define
constとの違いはdefineは関数なので、引数には関数でもOK。
define('APP_PATH' , dirname(__DIR__)); echo APP_PATH; //C:\xampp\htdocs\
型
データ型
変数には複数の型がある。PHPは文字を勝手に数値として判断してくれるような曖昧な特徴があるので注意。
- 文字列(string型)・・・’hello’ “world”
- 整数(int型) ・・・ 4 や -10
- 浮動小数点数(float型) ・・・1,8 や -3.2
- null(ヌル、ナル) ・・・null
- 真偽値(bool型) ・・・true や false
- 配列(array型) ・・・[5,3,10]
- オブジェクト(object型) ・・・ new Object()
変数の型を調べる
変数の型はvar_dumpやgetTypeで調べることができる。
$a = 'hello'; $b = -10; $c = -1.3; $d = null; $e = true; $f = [1,5]; var_dump($a); //string(5) "hello" var_dump($b); //int(-10) var_dump($c); //float(-1.3) var_dump($d); //NULL var_dump($e); //bool(true) var_dump($f); //array(2){ [0]=>int(1) ..
型変換
型変換をする方法にキャストというやり方がある。(型)を前に置く。変数に対しても使える。
$a = (float)15; $b = (string)2.3; var_dump($a); //float(15) var_dump($b); //string(3) "2.3" $b = (int)$b; var_dump($b); //int(2)
変数のデータを消去
$score = 0; //integer $score = ''; //string $score = null; //NULL
四則演算
加算(足し算)
echo 7 + 3; //10
減算(引き算)
echo 7 - 3; //4
除算(割り算)
echo 7 / 3; //2.3333
剰余(割り算のあまり)
echo 7 % 3; //1
累乗計算
どちらでもOK
echo pow(5,2) //5*5=25 echo 7 ** 3; //7*7*7=343
単項演算子
$b = 2; echo $b++; //3 echo $b--; //2
加算代入(足しこみ)
$sum = 5; echo $sum += 1; //6 echo $sum *= 5 //30
符号を逆転する
$input = -3; echo -$input; //3
条件文
if文
if基本形
$color = 'red'; if($color === 'red') { echo '赤です'; }
else形
$color = 'red'; if($color === 'red') { echo '赤です'; }else{ echo '赤ではありません'; }
elseif形
$color = 'blue'; if($color === 'red') { echo '赤です'; }elseif($color === 'blue') { echo '青です'; }
elseif & else形
$color = 'pink'; if($color === 'red') { echo '赤です'; }elseif($color === 'blue') { echo '青です'; }else{ echo 'その他です'; }
等しくない(型無視)
等しくない場合は、!=(型無視)、!==(型も含む)。<>は使えない。
if ($i !== $kensu){ //処理 }
Switch文
いわゆるselect文。上から順に比較する。各比較にbreakを付けること。
breakがあればそこでswitch文を抜けるが、breakがなければ引き続き次のcase比較をし続けてしまう。
case文を2つ書けばor条件のように判定してくれる。
$signal = 'green'; switch($number){ case 'red': echo 'Stop!'; break; case 'yellow': echo 'Caution!'; break; case 'blue': case 'green': echo 'Go!'; break; default: echo 'no signal'; }
比較演算子
比較演算子の基本。
>= 以上 <= 以下 > ~より大きい < ~より小さい == ~と等しい === ~と等しい(型も) != ~と等しくない !== ~と等しくない(型も)
// 文字の1を代入 $n = "1"; // 下記の例では一致になる if ($n == 1) { echo '一致'; }else{ echo '不一致'; } // 下記の例では不一致になる if ($n === 1) { echo '一致'; }else{ echo '不一致'; }
値の評価
以下の場合はfalse判定、それ以外はtrueとなる。$x = 3をIF文の条件式に入れればTrue判定になる。
false ±0 , ±0.0 '0' '' null []
論理演算子
andやorで真偽値を取る演算子。
// && and なおかつ // || or もしくは // ! ではない $score = 60; $name = 'kouji'; if ($score >= 50 && $name === 'taguchi'){ echo 'Good job' . PHP_EOL; } //左右の式が両方ともtrueのとき (a > 3) && (b < 10)) //優先度高 (a > 3) and (b < 10) //優先度低 //左右の式のどちらかがtrueのとき (a < 3) || (b > 10) //優先度高 (a < 3) or (b > 10) //優先度低 //左右のどちらか一方だけがtrueのとき (a < 3) xor (b > 10) //元の式がfalseのとき !(a == 3)
条件演算子
0未満の場合は0、それ以外はそのまま表示する。ifを使えば5行必要だが条件演算子を使えば1行で済む。
読みにくいので仕組みを理解しておく程度。
function sum($a, $b, $c) { $gou = $a + $b + $c; // 条件式 ? 真の値 : 偽の値 return $gou < 0 ? 0 : $gou; } echo sum(100,1,-5);
ループ文
for文
ループする回数が決まっている場合はfor文が良い。カウンターは慣習的に$iを使うことが多い。
for(カウンタ変数初期化; ループ範囲; カウンタ増減) { 処理; } // Helloを5回書き出す for($i = 1; $i <= 5; $i++) { echo 'Hello' . PHP.EOL } // 与えられた回数分まわす $cnt = 5; for($i = 0; $i < $cnt; $i++) { echo $i.PHP_EOL; //0,1,2,3,4の5回 } // カウントダウンする $cnt = 5; for($i = $cnt; $i >=0; $i--) { echo $i.PHP_EOL; //5,4,3,2,1,0 }
while文
ある条件が満たされている間、特定の処理を行う。
最初から条件が満たされていない場合は何も処理しない。
while(条件) { 処理; } // HPが0になるまで処理 $hp = 100; while($hp > 0) { echo $hp . PHP_EOL; $hp -= 15; }
do while文
とりあえず一度は処理を実行させたい場合
do { 処理; } while(条件); //以下の場合は条件には合致しないが一度は処理される。 $hp = -15; do { echo $hp . PHP_EOL; $hp -= 15; } while($hp > 0);
ループの中で処理をスキップする continue
continueを使って処理を飛ばす。
// 4のときだけechoしない for ($i = 1; $i <= 10; $i++) { if ($i === 4) { continue; } echo $i . PHP_EOL; }
ループを抜ける break
continueは読み飛ばしだが、完全にループ自体を抜けるときに使う。
for ($i = 1; $i <= 10; $i++) { //4のときに抜けるので1.2.3だけ if ($i === 4) { break; } echo $i . PHP_EOL; }
与えられた整数回数足しこむ
$sum = 0; $input_lines = 5; for ($i = 1; $i <= $input_lines; $i++) { $sum = $sum + $i; } echo $sum; //15
n個の文字列を出力する
$input_lines = 5; for ($i = 1; $i <= $input_lines; $i++) { echo "*"; //***** }
与えられた文字数からカウントダウン
$i = 5; while($i > 0) { echo $i."\n"; $i--; }
ファイルから配列へ
$input = trim(fgets(STDIN)); while($input) { $array[] = $input; $input = trim(fgets(STDIN)); }
while文のエレガントな書き方
while($input = trim(fgets(STDIN))) { //条件文にread処理を入れる $array[] = $input; } print_r($array);
while文の書き方
whileで指定した条件に合致したら継続してループし、外れたら抜ける。
$a = 5; while($a > 0) { echo $a; $a--; } //54321
do-whileの書き方
最初一回は必ず実行したいときはdo-whileを使う。
whileで指定した条件に合致したら継続してループし、外れたら抜ける。
$a = 5; do { echo $a; $a--; } while ($a > 0); //54321
foreachで配列の値を全て取り出す 配列read
元の配列が$arrayでasの右に値となる変数。
$array = array("勇者","魔法使い","遊び人"); foreach($array as $value){ echo $value."\n"; }
foreachで連想配列の値を取り出す
$array = array( "ショートソード" => 1, "ロングソード" => 5, "ブレードソード" => 3, ); foreach($array as $key => $value){ //$key => $value echo $key.$value."\n"; }
$scores = [ 'first' => 90, 'second' => 40, 'third' => 100, ]; foreach($scores as $key => $value) { echo "$key:".$value . PHP_EOL; }
readして連想配列をchainしてoutput
$MMF040 = array{ "1101 => "黒", "1102 => "白" ); while($input = trim(fgets(STDIN)){ $array[] = $input; } foreach($array as $value){ echo $value."の品種は".$MMF040[$value]; }
連想配列から条件を指定したり並び替えて連送配列へ
while($input = trim(fgets(STDIN))){ $array = explode(",",$input); $key = $array[0]; $value = $array[1]; $item[$key] = $value; } arsort($item); foreach($item as $key => $value){ if($value <= 2000){ //2000円以下なら $item2[$key] = $value; //別の配列に入れる } } print_r($item2);
関数類
絶対値を返す abs
絶対値とは原点からの距離、0を中心にどれだけ離れたか。マイナスの符号を消せばいい。
echo abs(-9); //9 echo abs(9); //9
小数点以下を切り捨て floor
echo floor(123.45); //123 echo floor(123.69); //123
小数点以下を切り上げ ceil
echo ceil(123.45); //124 echo ceil(123.01); //124
整数の下2桁を切り捨てする(割引)
1080円を1000円や、1250円を1200円にする。
例えば1080を100で割ると10.8それをfloorすると10になり、X100すると1000円。
1250を100で割ると12.5になり、12になり、X100すると1200円になる。
echo floor(($input)/100)*100;
ROUNDDOWNする
PHPはROUNDしかなく強制的に四捨五入されてしまうので、ROUNDDOWNは難しいみたい。円周率を2桁でROUNDDOWNする場合は簡単だが、10桁の場合はちょうど繰り上がりする。
$keta = 2; $ensyu = 3.141592653589793; echo floor($ensyu * pow(10, $keta)) / pow(10,$keta); floor(数字 * pow(10,桁数)) / pow(10,桁数); となる。
大文字に変換 strtoupper
echo strtoupper('abc'); //ABC
文字の切り出し substr
ビルトイン関数
固定長のデータを扱うときなどにも便利。最後までの場合は第3引数は省略してもよい。
//substr(文字列,位置,桁数); echo substr('abcdef',0,3); //結果はabc $input = '20200401Item-A 1200'; echo substr($input,0,8) . PHP_EOL; //20200401 echo substr($input,8,8) . PHP_EOL; //Item-A echo substr($input,16) . PHP_EOL; //1200
文字の出現数のカウント substr_count
その文字列の中に、特定の文字が存在する回数。
echo substr_count('PAIZA','A'); //結果は2
配列の値の数を数える array_count_value
この関数を配列に対して使うと、その値をキーにして出現回数をカウントして連想配列で返す
$array = ['W','S','W','W','W']; $array2 = array_count_value($array); echo $array2['W']; //5 echo $array2['S']; //1
何文字目にあるかを探す strpos、mb_strpos
日本語などのマルチバイト文字はmb_strposを使用すること。
echo strpos('ABCDEF','A'); //0 echo strpos('ABCDEF','D'); //3 echo mb_strpos('こんにちは','に'); //2
文字が含まれるかを判定するときに
if (strpos('ABC','A')){ echo '含む'; //表示されない }
とするとechoは出力されない。strposの返り値0はIF文の中ではFalseとして認識される。
ゆえに含むかどうかを判定する場合は
if (strpos('ABC','A') !== false) { echo '含む'; //表示される }
とすること。厳密に判定しないとダメなので!=もNG。
指定文字が含まれるかどうか str_contains
PHP8から適用されたらしい。日本語も動いた。含むか含まないかを調べるならstrposより使いやすいかも。
$input = 'ABC'; echo str_contains('ABC','A'); //1 echo str_contains('ABC','B'); //1 if (str_contains('ABC','B')) { echo '含む'; //表示される } echo str_contains('ありがとう','がと'); //1
文字列から数字だけを取り出す preg_replace
$string = 'ST0012A'; echo preg_replace('/[^0-9]/','',$string); //0012
2進数を10進数に変換する bindec
11111なら16+8+4+2+1なので
echo bindec(11111); //31
10進数を2進数に変換する decbin
31を二進数に変換すると11111
echo decbin(31); //11111
行の先頭や行末のスペースを取り除く trim
ビルトイン関数
echo trim(' aaa '); //aaa
ランダム値を取得する rand
引数1が最小値、引数2が最大値で指定
echo rand(1,6); //1~6の乱数 echo rand(1,2); //1~2の乱数 echo rand(0,2); //0~2の乱数 mt_randの方が高速らしい。ら
ランダムを取得する mt_rand
ドットインストールで使っていた。通常のrandよりも高速らしい。引数の指定は同じ。
echo mt_rand(1,5); //1〜5の乱数
四捨五入 round
$num = 123.45; echo round($num,2); //小数点第二位を四捨五入 123.45 echo round($num,1); //小数点第一位を四捨五入 123.5 echo round($num,-1); //1の位を四捨五入 120 echo round($num,-2); //10の位を四捨五入 100 $num = 156.65; echo round($num,2); //小数点第二位を四捨五入 156.65 echo round($num,1); //小数点第一位を四捨五入 156.7 echo round($num,-1); //1の位を四捨五入 160 echo round($num,-2); //10の位を四捨五入 200
小数の桁を指定して表示する number_format
カンマ区切りを追加する。小数点の桁を表示することもできる。
通常はroundで事足りるが、0をroundした場合は、少数桁は表示されず0となる。number_formatを使ってあげるとよい。
echo number_format(1200); //1,200 $num = 0; echo number_format($num,1); //結果は0.0
文字の置換 str_replace
//str_replace(置き換え元,置き換え先,対象文字列); $str = "うそでしょう"; echo str_replace('うそ','ほんと',$str); //ほんとでしょう
置き換え元を配列にできる
aiueoの母音を削除する
$array = ['a','i','u','e','o']; $string = 'arigato'; echo str_replace($array,'',$string); //rgt
置き換え元と後を配列で指定することもできる
$array = array('5','4','3','2','1'); $array2 = array('A','B','C','D','E'); echo str_replace($array,$array2,3); // 3と同じ配列要素のCが表示される
置き換え対象を配列にすることもできる
$array = ['A','B','O','AB']; var_dump(str_replace('A','1',$array)); //1,B,O,1B
配列の単語ごとに置き換える
$array = ['A','B','O','AB']; $array2 = array_map(function($x){ return $x == 'A' ? '1' : $x; }, $array); var_dump($array2); //1,B,O,AB
位置と桁数を指定して置換 substr_replace
//substr_replace(文字列,置換文字,位置、桁数); $input = '20200401Item-A 1200'; echo substr_replace($input,'Item-B ',8,8) . PHP_EOL; //20200401Item-B 1200
指定した文字数で文字列を改行する wordwrap
wrapは回り込ませるという意味だったと思う。trueをつけない場合は単語として認識されるものは、その位置で回り込まないようになる。
// ABC,DEF,GHI...のように指定した3ごとに改行が差し込まれる。 echo wordwrap('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 3, "\n", true);
文字列を反転させ逆順にする strrev
$input = 'ABCDE'; echo strrev($input); //EDCBA
文字数の長さ strlen、mb_strlen
ビルトイン関数
日本語などのマルチバイト文字はmb_strlenを使用する。
echo strlen('ABC'); //3 echo mb_strlen('こんにちは'); //5
数字の先頭を0で桁埋め sprintf
$hoge = 123; echo sprintf('%04d',$hoge); //結果は0123 3桁は%03d
数字の0埋め str_pad
//引数1:対象 //引数2:合計桁数 //引数3:埋める文字 //引数4:左・右・両方(BOTH) echo str_pad($input_lines,3,0,STR_PAD_LEFT); //例 $input = "Alien"; echo str_pad($input,10); // 結果は "Alien " echo str_pad($input,10,"0",STR_PAD_LEFT);// 結果は "0000Alien" echo str_pad($input,10,"_",STR_PAD_BOTH);// 結果は"__Alien___" echo str_pad($input,6,"*"); // 結果は "Alien*" echo str_pad($input,3,"*"); // 結果は "Alien"
配列から最大値/最小値 max/min
$array = array(5,1,3,4,2); echo max($array); //5 echo min($array); //1
連想配列でmaxとmin
ややこしそうに見えるがキーと値は並列の1行もの。maxやminの結果はあくまで値の最大値と最小値を返す。キーは関係ない。
for($i = 0; $i < 5; $i++) { $array[$i] = $i + 5; } var_dump($array); array(5) { [0] => int(5), [1] => int(6), [2] => int(7), [3] => int(8), [4] => int(9), ] echo max($array); //9 echo min($array); //5
連想配列でカウント
これも上記と同じ。キーと値は並列の1行もの。キーと値の1対の数がcountで返される。
//キーが5件できるのでcountの値は5 for($i = 0; $i < 5; $i++) { $array[$i] = $i + 5; } echo count($array); //5 //キーは1件で足しこまれるだけなのでcountの値は1 for($i = 0; $i < 5; $i++) { $array[1] = $i + 5; } echo count($array); //1
文字列を数値・整数に変換する
キャスト演算子を使う
$kazu = "123"; var_dump($kazu); //string var_dump((int)$kazu); //int
intval関数を使う。変換できない文字列を渡した場合は0になります。小数点以下の切り捨てにも使える。
$kazu = "123"; var_dump(intval($kazu)); //int
10進数を2進数に変換する
echo decbin(44); //101100
配列から先頭の要素を取り出す array_shift
配列の先頭の要素(一番左)を取り出して他の要素も左に詰める。
戻り値をとるようにすれば、取り出した要素の値を受け取れる
$array = array("a","b","c","d","e"); var_dump($array); //abcde echo array_shift($array); //a var_dump($array); //bcde
配列の末尾から要素を取り除く array_pop
$array = array("a","b","c","d","e"); array_pop($array); var_dump($array); //abcd
配列の先頭を後方に移動し、元ある要素を左にずらす
「あいうえお」の「あ」を後方に持っていき、「いうえお」を先頭側にずらし「いうえおあ」にするやり方。
$array = array("a","b","c","d","e"); var_dump($array); //abcde $array[] = array_shift($array); var_dump($array); //bcdea
配列の最後を先頭に移動し、元ある要素を右にずらす
array_popで末尾のデータを抜き取れ、array_shiftを使えば配列の先頭に追加できる。両方とも使えば実現できる。
$array = array("a","b","c","d","e"); array_unshift($array,array_pop($array)); var_dump($array); //eabcd
配列の先頭の要素に挿入し右にずらす。array_unshift
第1引数に配列を、第2引数に挿入したい値を入れる。
挿入された他の要素は右にずれる、というか再度番号が振り直される感じ。
第2引数以降のパラメータも増やしてもいいみたい。順番は下記の通り。
$array = array("a","b","c","d","e"); array_unshift($array,"0"); var_dump($array); //0abcde array_unshift($array,"1","2","3","4","5","6"); var_dump($array); //1234560abcde
配列の最後の要素の後ろに挿入する array_push
普通に$array[] =とした方がいい。関数を使うとその分のオーバーヘッドが必要になる。
$array = array("a","b","c","d","e"); array_push($array,"0"); var_dump($array); //abcde0 array_push($array,"1","2","3","4","5","6"); var_dump($array); //abcde0123456
配列の重複した要素を削除する array_unique
配列の要素に重複した値があれば、要素ごと削除します。
おそらく配列の初めから順に見ていき、すでにあるものは要素ごと消し去る。
$array = str_split('DABBCA'); $array = array_unique($array); var_dump($array); // [0]=>'D',[1]=>'A',[2]=>'B',[4]=>'C' // 尚、下記のように回せば foreach($array as $key => $value) { echo $key; //0124が表示される }
配列の中身が全て同じか調べる array_unique&count
文字列が全部同じ文字かどうかを調べるとき3個程度ならIF文でできるが、10文字もあれば大変。そういうときarray_uniqueでも調査できる。
$string = 'AAAAAAAAAAABAAA'; $array = str_split($string); echo count(array_unique($array)); //1ならOK、2以上ならNG
文字列と数字数値の判定
数字かどうかを判定する is_numeric
型が文字列であっても数値に変換できるものは数値として判定される面倒な仕様。
is_numeric('99'); //true is_numeric(100); //true is_numeric(2.1); //true is_numeric("aaa"); //false is_numeric(null); //false is_numeric(array()); //false //数値ならnum! for($i = 0; $i < count($input); $i++) { if (is_numeric(substr($input,$i,1))) { echo "num!"; } }
整数値かどうかを判定する is_int
’99’などの文字列はfalseになってしまう。型として文字のものは文字として認識されるので良い仕様。
is_int(99); //true is_int('99'); //false is_int(9.9); //false is_int('9.9'); //false is_int("test"); //false is_int(null); //false is_int(array()); //false
文字列かどうかを判定する ctype_digit
’99’は文字と認識されtrueになる。型として文字なものは文字として認識するので良い仕様。
ctype_digit('99'); //true ctype_digit(99); //false ctype_digit(9.9); //false
関数
関数を作る
同じ処理を繰り返す場合は関数としてまとめる。
function 関数名() { 処理; } // 関数を作る function ad() { echo '- Ad -'; } // 関数を呼び出す ad();
関数に引数を渡す
関数を呼び出すときに値を渡す。
関数を定義しているときの引数は仮置きしているので仮引数、実際に関数を呼び出すときに渡す引数は実引数という。
引数を渡さなかった場合のデフォルト値を定義する場合は$ad = ‘値’とする。
function ad($ad) //仮引数 { echo "- $ad -" . PHP_EOL; } ad('top'); //実引数 ad('middle'); ad('bottom');
returnで値を返す関数
関数内でreturnと書けばその時点で値が戻されて、それ以降の処理は無視される。
関数内にechoで値を吐き出すだけよりも、値を返す方が利用価値はあがる。
デフォルト値を= 0で定義すると引数の数を減らすこともできる。
function sum($a,$b,$c) { return $a + $b + $c; } echo sum(5,4,9);
関数の外で定義された変数を関数内で使いたい global
PHPでは関数の外で定義された変数は、関数の中で使うことはできない。使うときはglobalを使う。
$tax = 1.1; function sum($a,$b) { global $tax; echo ($a + $b) * $tax; } sum(5,10); //16.5
但し上記の処理は見にくくなるので、変数の値を引数として渡すか、関数内で使う変数は関数内で定義する方がいい。
グローバルスコープ、ローカルスコープ、同じ変数であっても定義は別。
$tax = 1.1; //グローバルスコープ function sum($a,$b) { $tax = 1.08; //ローカルスコープ echo ($a + $b) * $tax; } sum(5,10); //16.2
無名関数
関数自体を値として使ったり、関数自体を別の関数の引数として使うことができるので便利。
$sum = function ($a, $b, $c){ return $a + $b + $c; }; echo $sum(100,300,200) . PHP_EOL;
関数の引数の型付け
関数に使う引数に型を指定することもできる。
function score(string $name, int $score) { echo "$name:" . $score; } score('kouji','100'); //kouji:100 score('kouji','48'); //kouji:48 score('kouji','kouji'); //Error
ただし、PHPは数字に見える文字は自動で型変換されてしまう。型変換されたくない場合はstrict_typeを指定する。
declare(strict_types=1); function score(string $name, int $score) { echo "$name:" . $score; } score('kouji','48'); //Error
nullになる可能性がある場合は型の前に?をつけること
declare(strict_types=1); function getOK(?int $score): ?string { return $score >= 100 ? "OK" : null; } echo getOK(90); //null echo getOK(180); //OK echo getOK(null); //null
可変長引数
与えた引数を加算する関数として$a, $b, $cなどを引数にしても引数の数は合わせないとエラーにある。
そういう場合に引数に…とすると可変長にすることができる。
function sum(...$numbers) { $total = 0; foreach ($numbers as $number) { $total += $number; } return $total; } echo sum(2,4,6) . PHP_EOL; //12 echo sum(4,1,6,5,4,5,6) . PHP_EOL; //31
配列を返す関数(複数の戻り値)
function getStats(...$numbers) { $total = 0; foreach ($numbers as $number) { $total += $number; } return [$total, $total / count($numbers)]; } [$sum,$average] = getStats(1,3,5); list($sum,$average) = getStats(1,3,5); //listを使う方法もある echo $sum . PHP_EOL; //9 echo $average . PHP_EOL; //3
配列
配列とは
・変数の中に別の変数をつくる仕組み。
・中の変数の1つ1つを要素という。3つあれば3つの要素。
・要素にはそれぞれ異なる名前のキーが必要。文字か整数。
・要素に代入されたデータを値という。
・キーが文字列の配列を連想配列という。キーが数字の配列を単に配列という。
・変数=配列。変数名=配列名となる。
配列の初期化
$colors = [];
作り方① ひとつづつ順番に値を代入していく
$colors[] = '白'; $colors[] = '黒'; $colors[] = '赤'; $colors[] = ''; echo $colors[0]; //白 echo $colors[1]; //黒 echo $colors[2]; //赤 echo $colors[3]; //ブランク
注意
変数というのは代入されて初めて定義され型を持つ。
//これは初期化のように見えて、ブランクを追加で配列に挿入しているだけ。 $colors[] = ''; //これも初期化のように見えて、文字型の変数に定義もしくは初期化しているだけ。 //この場合は次に$colors[] = '白';としても文字列定義済なので、配列が入らない。 $colors = '';
②ひとつづつキー名を指定して要素を作る
$colors[0] = '白'; $colors[1] = '黒'; $colors[2] = '赤'; //呼び出す添え字は数値 echo $colors[0]; //白 echo $colors[1]; //黒 echo $colors[2]; //赤 //配列の上書きはそのまま指定 $colors[0] = '紫';
③カギカッコで代入
$scores = [ 90, 100, 50, ]; echo $scores[2]; //50
④array関数を使う方法(インデックス配列の場合)
$team = array('白','黒','赤'); echo $team[0]; //白 echo $team[1]; //黒 echo $team[2]; //赤
⑤array関数を使う場合(連想配列の場合)
$array = array(キー① => 値①,・・・・); $colors = array( 'white' => '白', 'black' => '黒' , 'red' => '赤' );
⑥explodeで分割して放り込む
カンマやスペースで文字列を分割するとき。
第一引数に区切り文字、第二引数に文字列。結果は配列に。
$input_lines = 'English,Math,Japanese'; $ans = explode(',',$input_lines); echo $ans[0]; //English echo $ans[1]; //Math
さらに追加したい場合は
$ans[] = "Science";
とすればいい。
⑦文字列からstr_spritで流し込む
文字列から指定文字ごとに配列に流し込む方法
// 5つの配列要素にA,B,C,D,Eがそれぞれ入る $array = str_split('ABCDE'); // ブランクも1つの配列としてみなされ、A,B, ,D,Eとなる。 $array = str_split('AB DE'); // 第2引数に指定すれば2文字づつも可能。AB,CD,Eとなる。 $line = str_split('ABCDE',2);
配列の中身をすべてわかりやすく表示する
print_rのほうが見やすいけど、var_dumpのほうが型も表示してくれる。
print_r($colors); var_dump($colors);
配列に配列の値を追加する
…をつける。つけなければ途中2次元配列になり、2つ目の要素が配列の20,15になる。
$more = [ 20, 15, ]; $scores = [ 80, ...$more, 40, 99, ]; print_r($scores); //80,20,25,40,99になる
要素の削除
unset($team[2]); //2番目の要素を削除 //[0][1][3][4]となり繰り上がりはしない。
配列の要素数 count
echo count($array);
空行あった場合の配列に入れる処理
改行コードを最初に取るとwhile文の判定で止まってしまう。
$input = fgets(STDIN); //ここでtrimをやめて while($input) { $array[] = trim($input); //ここでtrimをする $input = fgets(STDIN); } print_r($array);
配列を使ったランダムくじびき
$input = trim(fgets(STDIN)); $member = explode(",",$input); $max = count($member) - 1; $key = rand(0,$max); echo $member[$key];
N数分、配列を準備する。(席数確保例)
$seat_num = 6 //6席分 $seat = array(); //配列定義(必要) $seat = array_pad($seat,$seat_num,0) //6席分空席0を登録
配列の並び替え(昇順)sort
$item = array("イージスシールド","ウィンドスピア","アースブレイカー"); sort($item); //アース、イージス、ウィンドの順になる。
配列の並び替え(降順)rsort
rsort($item); //ウィンド、イージス、アースの順になる。
配列の数値を合計する array_sum
$array = [5,4,3,2,1]; echo array_sum($array); //15
配列の数値を乗算する array_product
配列の中身を全部掛け算する
$array = [5,2,3]; echo array_product($array); //30
配列の数値の平均を出す
$array = [5,4,3,2,1]; $sum = array_sum($array); //15 echo $sum / count($array); //3
配列の中に特定の値が含まれているか in_array
単に含まれているかどうかを調査する場合。該当があれば戻り値は1。2件含まれていても2とは表示されない。
// in_array(探したい文字列,検索対象の配列); $array = [2,4,8,16,32,64]; echo in_array(2,$array); //あるので1が返る $array = [2,4,8,16,32,64]; echo in_array(3,$array); //無いので何も返らない if(in_array(2,$array)) { echo "OK"; //trueなのでOKを出力 } // 該当件数が複数あっても返るのは1 $array = [2,4,8,16,32,64,2]; echo in_array(2,$array); //2は配列に2つあるが返るのは1
配列に特定の値が含まれているかindexを返す array_search
含まれているなら、配列の添字を返してくれる。ただし、該当が複数あっても返すのは最初のindexだけ。
// array_search(探したい文字,検索対象の配列); $array = ['A','B','C','D']; echo array_search('D',$array); //3 // 複数含まれている場合でも最初のインデックスのみ返す $array = ['A','D','C','D']; echo array_search('D',$array); //1
配列に特定の値が含まれているかindexを返す array_keys
array_searchと違って戻り値を配列で返してくれる。ゆえに複数の値があっても対応可能。引数の指定が逆なのに注意。
// array_keys(検索対象の配列,探したい文字); $array = ['D','A','B','C','D']; var_dump(array_keys($array,"D")); //[0,4] $array = ['A','B','C','D']; var_dump(array_keys($array,"D")); //[3]
連想配列
値にアクセスするためのキーを数値のインデックスではなく文字や数字にすることができる。
連想配列を使用する場合は「=>」を使う。
カギカッコを使う
$scores = [ 'first' => 90, 'second' => 40, 'third' => 100, ];
array関数を使う
$item = array( 'ひのきの棒' => 1, 'こんぼう' => 5, ); echo $item['こんぼう']; //5
入力値からアイテムをwhileで合計する
例えばpaizaなどでありそうな、ドラクエなので入手したアイテムを足し込んでいく系。
!issetを仕込んでおかないと足しこみはできないのでundefineになる
while($input = trim(fgets(STDIN))){ if(!isset($item[$input])){ $item[$input] = 0; } $item[$input]++; } var_dump($item);
連想配列に追加
$item['銅のつるぎ'] = 6; echo $item['銅のつるぎ']; //6
連想配列の書き換え
$item['銅のつるぎ'] = 10; echo $item['銅のつるぎ']; //10
連想配列の削除
unset($item['銅のつるぎ']); echo $item['銅のつるぎ']; //Undefined index:銅のつるぎ
連想配列を値で並び替え(昇順) asort
$item = array( "イージス" => 40, "ウィンド" => 1, "アース" => 12); print_r($item); asort($item); //連送配列はasortを使う print_r($item); //sortだと [0] => 1の普通の配列に変化する。
連想配列を値で並び替え(降順) arsort
arsort($item); //降順はrをつける
連想配列をキーで並び替え(昇順) ksort
ksort($item); //キーで並び替えるのでksort
連想配列をキーで並び替え(降順) krsort
krsort($item); //降順はrをつける
複数行を連想配列に入れるやり方
while($input = trim(fgets(STDIN))){ $key_value = explode(",",$input); //炎の剣,攻撃力2 $key = $key_value[0]; //炎の剣をわける $value = $key_value[1]; //攻撃力2をわける $team[$key] = $value; //キーを変数で指定 }
二次元配列
2次元配列
$answer['handle'] = ''; $answer['sex'] = ''; $answer['device'] = ''; //ここで3つの配列ができている $answer['device'][] = 'pc'; $answer['device'][] = 'phone'; $answer['device'][] = 'other'; //これで$answer['device']連想配列に、さらに0番目から3つ配列ができた。 Array( [handle] => [sex] => [device] => Array( [0] => pc [1] => phone [2] => other ) )
出現回数をカウントする
$input = trim(fgets(STDIN)); $array = explode(" ",$input); //配列に分解する foreach($array as $value){ //配列に対して処理をする $renso[$value] += 1; //値を連想配列のキーにして、値を足しこむ } foreach($renso as $key => $value2){ //連想配列のキーと足しこまれた値を echo $key." ".$value2; //順に吐き出す }
二次元配列の値を取り出す
$more = [ 20, 15, 'perfect', [90,42,88], ]; $scores = [ 80, ...$more, 40, 99, ]; echo $scores[4][2]; //88
日付
date関数
例 2015年4月1日午後4時3分9秒なら
echo date("Y"); //2015 echo date("y"); //15 echo date("m");//04 echo date("n"); //4 echo date("d"); //01 echo date("j"); //1 echo date("Y/m/d"); //2015/04/01 echo date("Y年n月j日"); //2015年4月1日 echo date("H"); //16 echo date("i"); //03 echo date("s"); //09 echo date("H:i:s"); //16:03:09
日付の計算
// 現在の年月日20190927 echo date("Ymd"); // 先月の初日 20190801 echo date("Ymd", strtotime('first day of previous month')); // 先月の最終日 20190831 echo date("Ymd", strtotime('last day of previous month')); // 来月の初日 20191001 echo date("Ymd", strtotime('first day of next month')); // 来月の最終日 20191031 echo date("Ymd", strtotime('last day of next month')); // 3ヶ月後の同じ日 20191227 echo date("Ymd", strtotime('3 month')); // 3ヶ月前の同じ日 20190627 echo date("Ymd", strtotime('-3 month')); // 3ヶ月後の初日 20190627 echo date("Ymd", strtotime('first day of 3 month'));
標準時間の設定
date_default_timezone_set('Asia/Tokyo');
便利関数
ディレクトリ情報を取得 dirnama
Laravelのコントローラで動かした場合
echo dirname(__FILE__); //C:\xampp\htdocs\app\Http\Controllers echo dirname(__NAMESPACE__); //App\Http echo dirname(__CLASS__); //App\Http\Controllers //引数に数字を与えると上の階層を見れるみたい。1はそのまま、2は一個上。 echo dirname(__DIR__); //C:\xampp\htdocs\app\Http echo dirname(__DIR__,1); //C:\xampp\htdocs\app\Http echo dirname(__DIR__,2); //C:\xampp\htdocs\app
その他
標準入力からの取得
$input = fgets(STDIN); //ダブルクォーテーションはなし
コメント