知識
文字コード
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.表示するブラウザの文字コード
エスケープシーケンス
Macの場合バックスラッシュは「Option+¥」で出せる。
\n 改行
\t タブ
\\ バックスラッシュ
\$ ドル記号
\” 二重引用符
変数の決まり
・変数の前には$をつける
・一文字目は半角アルファベットか半角アンダースコア
・二文字目は半角アルファベットか半角アンダースコアか半角数字
・アルファベットの大文字・小文字は区別される。
・ハイフンは使えない
・変数名の後ろは半角スペースをあける。空けたくない場合は{}で括る。
基礎
文字の結合
文字をつなげるときはドットでつなぐ
1 2 3 |
$output1 = "hello"; $output2 = "world"; echo $output1." ".$output2; //hello world |
エスケープ処理
別名サニタイジング(消毒、無毒化)
1 2 3 4 5 |
// 下記は < > & " のエスケープだけ htmlspecialchars($_GET['handle']); // 下記は < > & " プラス シングルクォーテーション'も含めてエスケープ htmlspecialchars($_GET['handle'],ENT_QUOTES); |
関数類
絶対値を返す abs
(絶対値とは原点からの距離、-はない)
1 |
echo abs(-9); //9 |
符号を逆転する
1 2 |
$input = -3; echo -$input; //3 |
小数点以下を切り捨て floor
1 2 |
echo floor(123.45); //123 echo floor(123.69); //123 |
小数点以下を切り上げ ceil
1 2 |
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円になる。
1 |
echo floor(($input)/100)*100; |
ROUNDDOWNする
PHPはROUNDしかなく強制的に四捨五入されてしまうので、ROUNDDOWNは難しいみたい。円周率を2桁でROUNDDOWNする場合は簡単だが、10桁の場合はちょうど繰り上がりする。
1 2 3 4 5 6 |
$keta = 2; $ensyu = 3.141592653589793; echo floor($ensyu * pow(10, $keta)) / pow(10,$keta); floor(数字 * pow(10,桁数)) / pow(10,桁数); となる。 |
大文字に変換 strtoupper
1 |
echo strtoupper('abc'); //ABC |
文字の切り出し substring
1 |
echo substr('abcdef',0,3); //結果はabc |
文字の出現数のカウント substr_count
その文字列の中に、特定の文字が何回現れたか
1 |
echo substr_count('PAIZA','A'); //結果は2 |
何文字目にあるかを探す strpos
1 2 |
echo strpos('ABCDEF','A'); //0 echo strpos('ABCDEF','D'); //3 |
行の先頭や行末のスペースを取り除く trim
1 |
echo trim(' aaa '); //aaa |
ランダム値を取得する rand
引数1が最小値、引数2が最大値で指定
1 2 3 |
echo rand(1,6); //1~6の乱数 echo rand(1,2); //1~2の乱数 echo rand(0,2); //0~2の乱数 |
四捨五入 round
1 2 3 4 5 6 7 8 9 10 11 |
$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を使ってあげるとよい。
1 2 |
$num = 0; echo number_format($num,1); //結果は0.0 |
置換 str_replace
1 2 |
$str = "うそでしょう"; echo str_replace('うそ','ほんと',$str); //ほんとでしょう |
文字数の長さ strlen
1 |
echo strlen('ABC'); //3 |
数字の先頭を0で桁埋め sprintf
1 2 |
$hoge = 123; echo sprintf('%04d',$hoge); //結果は0123 3桁は%03d |
数字の0埋め str_pad
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//引数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
1 2 3 4 |
$array = array(5,1,3,4,2); echo max($array); //5 echo min($array); //1 |
連想配列でmaxとmin
ややこしそうに見えるがキーと値は並列の1行もの。maxやminの結果はあくまで値の最大値と最小値を返す。キーは関係ない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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で返される。
1 2 3 4 5 6 7 8 9 10 11 |
//キーが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 |
配列にある値を検索してインデックスを返す
1 2 |
$array = ['JAVA', 'PHP', 'Python']; $result = array_search('PHP', $array); //1 |
文字列を数値・整数に変換する
キャスト演算子を使う
1 2 3 |
$kazu = "123"; var_dump($kazu); //string var_dump((int)$kazu); //int |
intval関数を使う。変換できない文字列を渡した場合は0になります。小数点以下の切り捨てにも使える。
1 2 |
$kazu = "123"; var_dump(intval($kazu)); //int |
10進数を2進数に変換する
1 |
echo decbin(44); //101100 |
配列から先頭の要素を取り出す array_shift
配列の先頭の要素(一番左)を取り出して他の要素も左に詰める。
戻り値をとるようにすれば、取り出した要素の値を受け取れる
1 2 3 4 |
$array = array("a","b","c","d","e"); var_dump($array); //abcde echo array_shift($array); //a var_dump($array); //bcde |
配列の末尾から要素を取り除く array_pop
1 2 3 |
$array = array("a","b","c","d","e"); array_pop($array); var_dump($array); //abcd |
配列の先頭を後方に移動し、元ある要素を左にずらす
「あいうえお」の「あ」を後方に持っていき、「いうえお」を先頭側にずらし「いうえおあ」にするやり方。
1 2 3 4 |
$array = array("a","b","c","d","e"); var_dump($array); //abcde $array[] = array_shift($array); var_dump($array); //bcdea |
配列の最後を先頭に移動し、元ある要素を右にずらす
array_popで末尾のデータを抜き取れ、array_shiftを使えば配列の先頭に追加できる。両方とも使えば実現できる。
1 2 3 |
$array = array("a","b","c","d","e"); array_unshift($array,array_pop($array)); var_dump($array); //eabcd |
配列の先頭の要素に挿入し右にずらす。array_unshift
第1引数に配列を、第2引数に挿入したい値を入れる。
挿入された他の要素は右にずれる、というか再度番号が振り直される感じ。
第2引数以降のパラメータも増やしてもいいみたい。順番は下記の通り。
1 2 3 4 5 |
$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[] =とした方がいい。関数を使うとその分のオーバーヘッドが必要になる。
1 2 3 4 5 |
$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 |
四則演算
除算
1 |
echo 7 / 3; //2.3333 |
剰余(割り算のあまり)
1 |
echo 11 % 2; //答えは1 |
累乗計算
どちらでもOK
1 2 |
echo pow(5,2) //5*5=25 echo 7 ** 3; //7*7*7=343 |
単項演算子
1 2 3 |
$b = 2 $b++ //これで3になる $b-- //これで2にもどる |
加算代入(足しこみ)
1 2 3 |
$sum = 0; $value = 5; $sum += $value; //sumは5 |
文字列と数字数値の判定
数字かどうかを判定する is_numeric
型が文字列であっても数値に変換できるものは数値として判定される面倒な仕様。
1 2 3 4 5 6 |
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 |
整数値かどうかを判定する is_int
’99’などの文字列はfalseになってしまう。型として文字のものは文字として認識されるので良い仕様。
1 2 3 4 5 6 7 |
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になる。型として文字なものは文字として認識するので良い仕様。
1 2 3 |
ctype_digit('99'); //true ctype_digit(99); //false ctype_digit(9.9); //false |
変数と定数
定数を定義 const
定数名は大文字で書くこと。
1 |
const TAX = 1.1 |
定数を定義 define
constとの違いはdefineは関数なので、引数には関数でもOK。
1 |
define('APP_PATH',dirname(__DIR__)); //C:\xampp\htdocs\ |
変数のデータを消去
1 |
$score = null; |
変数の形を調べる
1 2 3 4 5 6 7 8 9 10 11 |
$year = 2015; $temp = 26.5; $greeting = 'hello,world!'; $check = false; $n = null; var_dump($year); //int(2015) var_dump($temp); //float(26.5) var_dump($greeting); //string(12) "hello,world!" var_dump($check); //bool(false) var_dump($n); //NULL |
条件文
条件式if
==は型無視、===は型も判定
1 2 3 4 5 6 |
$n = 1; if ($n === 1) { echo '好き'; }else{ echo '嫌い'; } |
条件式 elseif
elseifは何度でも重ねられる。{}の閉じ忘れに注意
1 2 3 4 5 6 7 8 |
$n = 1; if ($n === 1) { echo '好き'; }elseif($n === 2){ echo 'どちらとも'; }else{ echo '嫌い'; } |
等しくない(型無視)
<>は使わない。
等しい場合は、!=(型無視)、!==(型も含む)
1 2 3 |
if ($i !== $kensu){ //処理 } |
Switch文
select文。上から順に比較する。各比較にbreakを付けること。
breakがあればそこでswitch文を抜けるが、breakがなければ引き続き次のcase比較をし続けてしまう。
1 2 3 4 5 6 7 8 9 10 11 |
$number = 3; switch($number){ case 1: echo '数値は1です。'; //処理1 break; case 2: echo '数値は2です。'; //処理2 break; case 3: echo '数値は3です。'; //処理3 break; default: echo "数値はその他です。"; //処理4 } |
比較演算子
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//左右の式が両方とも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) |
ループ文
与えられた整数回数足しこむ
1 2 3 4 5 6 |
$sum = 0; $input_lines = 5; for ($i = 1; $i <= $input_lines; $i++) { $sum = $sum + $i; } echo $sum; //15 |
n個の文字列を出力する
1 2 3 4 |
$input_lines = 5; for ($i = 1; $i <= $input_lines; $i++) { echo "*"; //***** } |
与えられた文字数からカウントダウン
1 2 3 4 5 |
$i = 5; while($i > 0) { echo $i."\n"; $i--; } |
ファイルから配列へ
1 2 3 4 5 |
$input = trim(fgets(STDIN)); while($input) { $array[] = $input; $input = trim(fgets(STDIN)); } |
while文のエレガントな書き方
1 2 3 4 |
while($input = trim(fgets(STDIN))) { //条件文にread処理を入れる $array[] = $input; } print_r($array); |
while文の書き方
whileで指定した条件に合致したら継続してループし、外れたら抜ける。
1 2 3 4 5 |
$a = 5; while($a > 0) { echo $a; $a--; } //54321 |
do-whileの書き方
最初一回は必ず実行したいときはdo-whileを使う。
whileで指定した条件に合致したら継続してループし、外れたら抜ける。
1 2 3 4 5 |
$a = 5; do { echo $a; $a--; } while ($a > 0); //54321 |
foreachで配列の値を全て取り出す 配列read
元の配列が$arrayでasの右に値となる変数。
1 2 3 4 |
$array = array("勇者","魔法使い","遊び人"); foreach($array as $value){ echo $value."\n"; } |
foreachで連想配列の値を取り出す
1 2 3 4 5 6 7 8 |
$array = array( "ショートソード" => 1, "ロングソード" => 5, "ブレードソード" => 3 ); foreach($array as $key => $value){ //$key => $value echo $key.$value."\n"; } |
readして連想配列をchainしてoutput
1 2 3 4 5 6 7 8 9 10 |
$MMF040 = array{ "1101 => "黒", "1102 => "白" ); while($input = trim(fgets(STDIN)){ $array[] = $input; } foreach($array as $value){ echo $value."の品種は".$MMF040[$value]; } |
連想配列から条件を指定したり並び替えて連送配列へ
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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); |
配列
配列とは
・変数の中に別の変数をつくる仕組み。
・中の変数の1つ1つを要素という。3つあれば3つの要素。
・要素にはそれぞれ異なる名前のキーが必要。文字か整数。
・要素に代入されたデータを値という。
・キーが文字列の配列を連想配列という。キーが数字の配列を単に配列という。
・変数=配列。変数名=配列名となる。
配列の初期化
1 |
$colors = []; |
作り方① ひとつづつ順番に値を代入していく
1 2 3 4 5 6 7 8 9 |
$colors[] = '白'; $colors[] = '黒'; $colors[] = '赤'; $colors[] = ''; echo $colors[0]; //白 echo $colors[1]; //黒 echo $colors[2]; //赤 echo $colors[3]; //ブランク |
注意
変数というのは代入されて初めて定義され型を持つ。
1 2 3 4 5 6 |
//これは初期化のように見えて、最初もしくは0番目要素にブランクを挿入しているだけ。 $colors[] = ''; //これも初期化のように見えて、文字型の変数に定義もしくは初期化しているだけ。 $colors = ''; //この場合は次に$colors[] = '白';としても文字列定義済なので、配列が入らない。 |
②ひとつづつキー名を指定して要素を作る
1 2 3 4 5 6 7 8 9 10 11 |
$colors[0] = '白'; $colors[1] = '黒'; $colors[2] = '赤'; //呼び出す添え字は数値 echo $colors[0]; //白 echo $colors[1]; //黒 echo $colors[2]; //赤 //配列の上書きはそのまま指定 $colors[0] = '紫'; |
③array関数を使う方法(インデックス配列の場合)
1 2 3 4 |
$team = array('白','黒','赤'); echo $team[0]; //白 echo $team[1]; //黒 echo $team[2]; //赤 |
④array関数を使う場合(連想配列の場合)
1 2 3 4 5 6 |
$array = array(キー① => 値①,・・・・); $colors = array( 'white' => '白', 'black' => '黒' , 'red' => '赤' ); |
⑤explodeで分割して放り込む
カンマやスペースで文字列を分割するとき。
第一引数に区切り文字、第二引数に文字列。結果は配列に。
1 2 3 4 |
$input_lines = 'English,Math,Japanese'; $ans = explode(',',$input_lines); echo $ans[0]; //English echo $ans[1]; //Math |
さらに追加したい場合は
1 |
$ans[] = "Science"; |
とすればいい。
配列をすべてわかりやすく表示する
1 2 |
print_r($colors); var_dump($colors); |
要素の削除
1 |
unset($team[2]); //2番目の要素を削除 //[0][1][3][4]となり繰り上がりはしない。 |
配列の要素数のカウント
1 |
echo count($array); |
空行あった場合の配列に入れる処理
改行コードを最初に取るとwhile文の判定で止まってしまう。
1 2 3 4 5 6 |
$input = fgets(STDIN); //ここでtrimをやめて while($input) { $array[] = trim($input); //ここでtrimをする $input = fgets(STDIN); } print_r($array); |
配列を使ったランダムくじびき
1 2 3 4 5 |
$input = trim(fgets(STDIN)); $member = explode(",",$input); $max = count($member) - 1; $key = rand(0,$max); echo $member[$key]; |
N数分、配列を準備する。(席数確保例)
1 2 3 |
$seat_num = 6 //6席分 $seat = array(); //配列定義(必要) $seat = array_pad($seat,$seat_num,0) //6席分空席0を登録 |
配列の並び替え
1 2 |
$item = array("イージスシールド","ウィンドスピア","アースブレイカー"); sort($item); //アース、イージス、ウィンドの順になる。 |
配列の並び替え(降順)
1 |
rsort($item); //ウィンド、イージス、アースの順になる。 |
配列の数値を全て足す(加算)
$array = [5,4,3,2,1];
echo array_sum($array); //15
連想配列
連想配列(配列キーを文字列で)
1 2 |
$item = array('ひのきの棒' => 1, 'こんぼう' => 5); echo $item['こんぼう']; //5 |
連想配列に追加
1 2 |
$item['銅のつるぎ'] = 6; echo $item['銅のつるぎ']; //6 |
連想配列の書き換え
1 2 |
$item['銅のつるぎ'] = 10; echo $item['銅のつるぎ']; //10 |
連想配列の削除
1 2 |
unset($item['銅のつるぎ']); echo $item['銅のつるぎ']; //Undefined index:銅のつるぎ |
連想配列を値で並び替え(昇順) asort
1 2 3 4 |
$item = array( "イージス" => 40, "ウィンド" => 1, "アース" => 12); print_r($item); asort($item); //連送配列はasortを使う print_r($item); //sortだと [0] => 1の普通の配列に変化する。 |
連想配列を値で並び替え(降順) arsort
1 |
arsort($item); //降順はrをつける |
連想配列をキーで並び替え(昇順) ksort
1 |
ksort($item); //キーで並び替えるのでksort |
連想配列をキーで並び替え(降順) krsort
1 |
krsort($item); //降順はrをつける |
複数行を連想配列に入れるやり方
1 2 3 4 5 6 |
while($input = trim(fgets(STDIN))){ $key_value = explode(",",$input); //炎の剣,攻撃力2 $key = $key_value[0]; //炎の剣をわける $value = $key_value[1]; //攻撃力2をわける $team[$key] = $value; //キーを変数で指定 } |
二次元配列
2次元配列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$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 ) ) |
出現回数をカウントする
1 2 3 4 5 6 7 8 |
$input = trim(fgets(STDIN)); $array = explode(" ",$input); //配列に分解する foreach($array as $value){ //配列に対して処理をする $renso[$value] += 1; //値を連想配列のキーにして、値を足しこむ } foreach($renso as $key => $value2){ //連想配列のキーと足しこまれた値を echo $key." ".$value2; //順に吐き出す } |
日付
date関数
例 2015年4月1日午後4時3分9秒なら
1 2 3 4 5 6 7 8 9 10 11 12 |
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 |
日付の計算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// 現在の年月日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')); |
標準時間の設定
1 |
date_default_timezone_set('Asia/Tokyo'); |
便利関数
ディレクトリ情報を取得 dirnama
Laravelのコントローラで動かした場合
1 2 3 4 5 6 7 8 |
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 |
その他
標準入力からの取得
1 |
$input = fgets(STDIN); //ダブルクォーテーションはなし |