PHP 自分の備忘録

IT関連

PHPの備忘録です。間違っていたらすみません。

  1. 事前知識
    1. 文字コード
    2. 文字化けが起きたとき調べるところ
    3. エスケープシーケンス
  2. 基礎
    1. コメントアウト
    2. 文字の結合
    3. ヒアドキュメント
    4. エスケープ処理(サニタイジング)
  3. 変数と定数
    1. 変数名の決まり
    2. 定数を定義 const
    3. 定数を定義 define
    1. データ型
    2. 変数の型を調べる
    3. 型変換
    4. 変数のデータを消去
  4. 四則演算
    1. 加算(足し算)
    2. 減算(引き算)
    3. 除算(割り算)
    4. 剰余(割り算のあまり)
    5. 累乗計算
    6. 単項演算子
    7. 加算代入(足しこみ)
    8. 符号を逆転する
  5. 条件文
    1. if文
      1. if基本形
      2. else形
      3. elseif形
      4. elseif & else形
    2. 等しくない(型無視)
    3. Switch文
    4. 比較演算子
    5. 値の評価
    6. 論理演算子
    7. 条件演算子
  6. ループ文
    1. for文
    2. while文
    3. do while文
    4. ループの中で処理をスキップする continue
    5. ループを抜ける break
    6. 与えられた整数回数足しこむ
    7. n個の文字列を出力する
    8. 与えられた文字数からカウントダウン
    9. ファイルから配列へ
    10. while文のエレガントな書き方
    11. while文の書き方
    12. do-whileの書き方
    13. foreachで配列の値を全て取り出す 配列read
    14. foreachで連想配列の値を取り出す
    15. readして連想配列をchainしてoutput
    16. 連想配列から条件を指定したり並び替えて連送配列へ
  7. 関数類
    1. 絶対値を返す abs
    2. 小数点以下を切り捨て floor
    3. 小数点以下を切り上げ ceil
    4. 整数の下2桁を切り捨てする(割引)
    5. ROUNDDOWNする
    6. 大文字に変換 strtoupper
    7. 文字の切り出し substr
    8. 文字の出現数のカウント substr_count
    9. 配列の値の数を数える array_count_value
    10. 何文字目にあるかを探す strpos、mb_strpos
    11. 指定文字が含まれるかどうか str_contains
    12. 文字列から数字だけを取り出す preg_replace
    13. 2進数を10進数に変換する bindec
    14. 10進数を2進数に変換する decbin
    15. 行の先頭や行末のスペースを取り除く trim
    16. ランダム値を取得する rand
    17. ランダムを取得する mt_rand
    18. 四捨五入 round
    19. 小数の桁を指定して表示する number_format
    20. 文字の置換 str_replace
      1. 置き換え元を配列にできる
      2. 置き換え元と後を配列で指定することもできる
      3. 置き換え対象を配列にすることもできる
      4. 配列の単語ごとに置き換える
    21. 位置と桁数を指定して置換 substr_replace
    22. 指定した文字数で文字列を改行する wordwrap
    23. 文字列を反転させ逆順にする strrev
    24. 文字数の長さ strlen、mb_strlen
    25. 数字の先頭を0で桁埋め sprintf
    26. 数字の0埋め str_pad
    27. 配列から最大値/最小値 max/min
    28. 連想配列でmaxとmin
    29. 連想配列でカウント
    30. 文字列を数値・整数に変換する
    31. 10進数を2進数に変換する
    32. 配列から先頭の要素を取り出す array_shift
    33. 配列の末尾から要素を取り除く array_pop
    34. 配列の先頭を後方に移動し、元ある要素を左にずらす
    35. 配列の最後を先頭に移動し、元ある要素を右にずらす
    36. 配列の先頭の要素に挿入し右にずらす。array_unshift
    37. 配列の最後の要素の後ろに挿入する array_push
    38. 配列の重複した要素を削除する array_unique
    39. 配列の中身が全て同じか調べる array_unique&count
  8. 文字列と数字数値の判定
    1. 数字かどうかを判定する is_numeric
    2. 整数値かどうかを判定する is_int
    3. 文字列かどうかを判定する ctype_digit
  9. 関数
    1. 関数を作る
    2. 関数に引数を渡す
    3. returnで値を返す関数
    4. 関数の外で定義された変数を関数内で使いたい global
    5. 無名関数
    6. 関数の引数の型付け
    7. 可変長引数
    8. 配列を返す関数(複数の戻り値)
  10. 配列
    1. 配列とは
    2. 配列の初期化
    3. 作り方① ひとつづつ順番に値を代入していく
      1. 注意
    4. ②ひとつづつキー名を指定して要素を作る
    5. ③カギカッコで代入
    6. ④array関数を使う方法(インデックス配列の場合)
    7. ⑤array関数を使う場合(連想配列の場合)
    8. ⑥explodeで分割して放り込む
    9. ⑦文字列からstr_spritで流し込む
    10. 配列の中身をすべてわかりやすく表示する
    11. 配列に配列の値を追加する
    12. 要素の削除
    13. 配列の要素数 count
    14. 配列を使ったランダムくじびき
    15. N数分、配列を準備する。(席数確保例)
    16. 配列の並び替え(昇順)sort
    17. 配列の並び替え(降順)rsort
    18. 配列の数値を合計する array_sum
    19. 配列の数値を乗算する array_product
    20. 配列の数値の平均を出す
    21. 配列の中に特定の値が含まれているか in_array
    22. 配列に特定の値が含まれているかindexを返す array_search
    23. 配列に特定の値が含まれているかindexを返す array_keys
  11. 連想配列
    1. カギカッコを使う
    2. array関数を使う
    3. 入力値からアイテムをwhileで合計する
    4. 連想配列に追加
    5. 連想配列の書き換え
    6. 連想配列の削除
    7. 連想配列を値で並び替え(昇順) asort
    8. 連想配列を値で並び替え(降順) arsort
    9. 連想配列をキーで並び替え(昇順) ksort
    10. 連想配列をキーで並び替え(降順) krsort
    11. 複数行を連想配列に入れるやり方
  12. 二次元配列
    1. 2次元配列
    2. 出現回数をカウントする
    3. 二次元配列の値を取り出す
  13. 日付
    1. date関数
    2. 日付の計算
    3. 標準時間の設定
  14. 便利関数
    1. ディレクトリ情報を取得 dirnama
  15. その他
    1. 標準入力からの取得

事前知識

文字コード

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

 

strposの注意点

文字が含まれるかを判定するときに

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);  //ダブルクォーテーションはなし

コメント

タイトルとURLをコピーしました