(他言語経験者)&&(PHP初心者)による個人的覚えておきたいところメモ


# 変数関連


## 可変変数
可変変数 = 変数名を[変数]によって決めることができる変数  
動的にクラスや関数の呼び出しを変更できる  

```php

$x = 'title';
$title = 'PHP:HyperTextPreProfessor';

print $$x;
// => PHP:HyperTextPreProfessor

```


## bool
以下のものは論理リテラルを必要とする状況では`False`になる  

 - 空文字列
 - 文字列の0(ゼロ)
 - 浮動小数点リテラルの0.0
 - 要素数が0の配列(空の配列)
 - null(未定義値)

**これら以外はすべて`True`となる**


# 演算子関連
## マジカルインクリメント

文字列に対してインクリメント出来てしまうという、個人的にちょっと気持ちの悪い機能

```php

$str = 'Z';

print ++$str;
// => AA
print ++$str;
// => AB

$str = 'D8';

print ++$str;
// => D9
print ++$str;
// => E0
```

## 配列の結合
```php

$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);
```

```php

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`にならない。

## 配列を比較する基準
配列同士にも'==', '>='などが利用でき、比較は以下の順序で行われる。

1. 要素数
2. 同じキーを持つ要素同士の値の大小(要素が見つかった時点で判定終了)
3. どちらも等しい場合、等価と判断される

**左辺の配列が持つキーを右辺が持っていない場合、比較は失敗する**


## 実行演算子
バッククォート(\`)で囲んだブロックをシェルコマンドとして実行。
色々と悪さができそうなので要注意。

```
$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版**