変数関連
可変変数
可変変数 = 変数名を[変数]によって決めることができる変数
動的にクラスや関数の呼び出しを変更できる
$x = 'title';
$title = 'PHP:HyperTextPreProfessor';
print $$x;
// => PHP:HyperTextPreProfessor
bool
以下のものは論理リテラルを必要とする状況ではFalse
になる
- 空文字列
- 文字列の0(ゼロ)
- 浮動小数点リテラルの0.0
- 要素数が0の配列(空の配列)
- null(未定義値)
これら以外はすべてTrue
となる
演算子関連
マジカルインクリメント
文字列に対してインクリメント出来てしまうという、個人的にちょっと気持ちの悪い機能
$str = 'Z';
print ++$str;
// => AA
print ++$str;
// => AB
$str = 'D8';
print ++$str;
// => D9
print ++$str;
// => E0
配列の結合
$assoc1 = [
'Apple' => 'Red',
'Orange' => 'Yellow',
'Melon' => 'Green'
];
$assoc2 = [
'Grape' => 'Purple',
'Apple' => 'Green',
'Strawberry' => 'Red'
];
$result = $assoc1 + $assoc2;
print_r($result);
$ary1 = [1, 2, 3];
$ary2 = [4, 5, 6];
$result = $ary1 + $ary2;
print_r($result);
Array(
['Apple'] => Red
['Orange'] => Yellow
['Melon'] => Green
['Grape'] => Purple
['Strawberry'] => Red
)
Array(
[0] => 1
[1] => 2
[2] => 3
)
左の配列に存在しないキーの要素を右の配列から取り出し、左の配列に追加する。
右の配列に左の配列と同じキーがあった場合、その値は無視される。
array_merge()
を使うと上書きになる
厳密な等価演算子'==='
PHPの等価演算子(==)は、データ型が異なる場合でもなんとかして等しくしようと評価する
'13xyz'==13
がTrue
になったり。
それを厳密に評価したいときに===
を用いる。
そもそもデータ型が一致しないとTrue
にならない。
配列を比較する基準
配列同士にも'==', '>='などが利用でき、比較は以下の順序で行われる。
- 要素数
- 同じキーを持つ要素同士の値の大小(要素が見つかった時点で判定終了)
- どちらも等しい場合、等価と判断される
左辺の配列が持つキーを右辺が持っていない場合、比較は失敗する
実行演算子
バッククォート(`)で囲んだブロックをシェルコマンドとして実行。
色々と悪さができそうなので要注意。
$result = `ls`; // windows機は `dir`
print mb_convert_encording($result, 'UTF-8', 'SJIS');
エラー制御演算子 (p.102)
@print 1/0;
文の先頭にエラー演算子(\@)をつけることで、警告メッセージが表示されなくなる 悪魔の演算子
既知のエラーを避けてテストしたいときに使う?
カンマ演算子
for($i=1, $j=1; $result = $i*$j, $i < 6; &i++, &j++){
print "{$i}*{$j}={$result}<br/>";
}
複数の式を記述できるので、よりコンパクトにコードが書ける。
制御構文
foreach
foreach(配列 as 変数){
// 処理
}
foreach(連想配列 as キー変数 => 変数){
// 処理
}
配列の要素が順番に変数に代入される
連想配列の場合、キー変数を指定することでキーの値も取得できる
基本的にPHPでは値渡しされるので、参照渡しがしたい場合は以下のようにする
参照渡しをすることで、ループ中に元々の配列の中身を変更することができる
foreach(連想配列 as &変数){
// 処理
}
goto
スクリプトの処理を強制的に他に移動できる
goto ラベル名
// 処理
ラベル名 :
しかし、以下の制限がある
- 異なるファイルには移動できない
- 関数やクラス/メソッドの中には移動できない
- ループの外からループ(switch含む)の内部には移動できない
組み込み関数
文字列関数
文字列系の関数は基本的にmb_
で始まる(Multi Byteの略?)
長さを取得 int mb_strlen(string $str [, string $enc])
- $str : 文字列
- $enc : 使用する文字エンコーディング
大文字/小文字の変換 string strtolower(string $str)
/ string strtoupper(string $str)
英字は1byte文字なのでmb
ではない
部分文字列 string mb_substr(string $str, int $start [, int $len, [, string $enc]])
- $str : 元の文字列
- $start : 取得開始位置(0スタート)
- $len : 取り出す文字数
- $enc : 使用する文字エンコーディング
部分文字列の置換 mixed str_replace(mixed $src, mixed $rep, mixed $str [, int &$cnt])
- $src : 置き換えたい文字列
- $rep : 置き換え後の文字列
- $str : 変更する文字列全体
- $cnt : 置き換えた文字列の個数を格納する変数
$str = 'あかぱじゃまあおぱじゃまきぱじゃま';
print str_replace('ぱじゃま', 'パジャマ', $str, $cnt)."\n";
print "{$cnt}個の置き換えをしました";
=> あかパジャマあおパジャマきパジャマ
=> 3個の置き換えをしました
\$stc, \$repには配列を渡すことも可能
それぞれのindexに対応した置換が行われる
文字列を区切り文字で分割 array explode(string $delimiter, string $str [, int $limit])
- $delimiter : 区切り文字
- $str : 分割したい文字列
- $limit : 分割の最大数(デフォルトは制限なし)
区切り文字は返り値には含まれない
$str = "りんごとみかんとぶどう";
$fruits = explode('と', $str);
=> fruits = ['りんご', 'みかん', 'ぶどう']
文字列の変換 string mb_convert_kana(string $str [, string $option = "KV" [, string $enc]])
- $str : 変換したい文字列
- $option : 変換オプション(p.158参照)
- $enc : 使用する文字エンコーディング
マルチバイト文字列をひらがなからカタカナ、全角を半角に変換したりできる。
文字エンコーディング変換 string mb_convert_encoding(string $str, string $to [, mixed $from])
- $str : 任意の文字列
- $to : 変換後の文字コード
- $from : 変換前の文字コード(デフォはmb_internal_encodingの値)
電子メールを送信する bool mb_send_mail(string $to, string $subject, string $msg[, string $headers [, string $param]])
- $to : 宛先
- $subject : 件名
- $msg : 本文
- $headers : メールヘッダ(Cc, Fromなど。「ヘッダ名 : 値」で改行区切り)
- $param : その他、メールシステムに渡すパラメータ情報
配列関数
要素数取得 int count(array $var [, int $mode = COUNT_NORMAL])
- $var : 対象の配列
- $mode : カウントの方法
$mode = COUNT_RECURSIVE
にすると、入れ子の要素も含めたカウントが行われる。
配列の連結 array array_merge(array $array1 [, array $array2 [, ...]])
- $array1, 2, ... : 連結する配列
+演算子
と異なり、キーが重複している場合には 「後者」 が優先される
また、index 番号 が重複している場合には新たに番号が振られ、上書きされない
$assoc1 = [
'Apple' => 'Red',
'Orange' => 'Yellow',
'Melon' => 'Green'
];
$assoc2 = [
'Grape' => 'Purple',
'Apple' => 'Green',
'Strawberry' => 'Red'
];
$result = array_merge($assoc1, $assoc2);
print_r($result);
$ary1 = [1, 3, 5];
$ary2 = [2, 3, 6];
$result = array_merge($ary1, $ary2);
print_r($result);
Array(
[Apple] => Green
[Orange] => Yellow
[Melon] => Green
[Grape] => Purple
[Strawberry] => Red
)
Array(
[0] => 1
[1] => 3
[2] => 5
[3] => 2
[4] => 3
[5] => 6
)
各要素を結合してString化 string implode(string $glue, array $pieces)
- $glue : 連結に使用する文字列
- $pieces : 連結する配列
$data = ['PHP', 'Perl', 'Ruby', 'Python'];
print implode(',', $data);
// => PHP,Perl,Ruby,Python
配列操作(追加、削除) array_push, array_pop, array_shift, array_unshift
- $array : 操作したい配列
- $var : 追加したい文字列
### 末尾
#### 追加
int array_push(array &$array, mixed $var [, $mixed $...])
#### 削除mixed array_pop(array &$array)
### 先頭 #### 追加int array_unshift(array &$array, mixed $var [, $mixed $...])
#### 削除mixed array_shift(array &$array)
複数要素を追加/置換/削除 array array_splice(array &$input, int $off [, int $len, mixed $rep])
- &$input : 操作対象の配列
- $off : 抽出開始位置
- $len : 取り出す要素数
- $rep : 削除箇所に挿入する配列
配列方特定範囲の要素を取得 array array_slice(array $array, int $off [, int $len [, bool $preserve = false]])
- $array : 任意の配列
- $off : 抽出開始位置
- $len : 取り出す要素数
- $preserve : 取得した要素のキーを維持するか
参考図書
独習PHP第3版