PHPの配列操作（一部）

#PHPの配列
使用の際は公式で調べたほうが無難です

##配列作成
```php
//配列宣言
$配列名 = array('値1', '値2', '値3');
$配列名 = ['値1', '値2', '値3'];
```
```php
//連想配列
$配列名 = array("キー1" => "値1", "キー2" => "値2");
$配列名 = ["キー1" => "値1", "キー2" => "値2"];
```

##配列関連の関数

###配列の結合
```php
新しい配列 = array_merge (配列1, 配列2,・・・);

$arr1 = array('A','B');
$arr2 = array('C','D');

$arr3 = array_merge($arr1, $arr2);
```

###配列　⇨ 文字
```php
文字列 = implode(区切り文字, 配列)
// 配列の要素と要素を区切り文字を挟んで連結する
// 1つの文字列にして返す。
// 区切り文字は省略可
$arr = array('AAA', 'BBB', 'CCC');
$result = implode(',', $arr); 
```
###文字列　⇨　配列にする。
```php
結果の配列 = explode(区切り文字, 文字列, 最大要素数)
// この配列の各要素は、文字列を区切り文字で区切った部分文字列となる。
// 文字列中の区切り文字は削除される。
// 最大要素数を指定した数に制限することもできる。省略可
// 先頭から順に区切り文字で区切られる
$string = 'AAA,BBB,CCC';
$result = explode(',', $string);
```

###切り出す
```php
結果の配列 = array_slice(入力の配列, 始点, 抽出する要素数);
// 切り取った部分を返す。
// 始点が配列のサイズより大きい場合は、空の配列を返す。
// 配列のポインタはリセットされる。
// 抽出する要素数は省略可
$arr = array(1, 2, 3, 4, 5);
$result = array_slice($arr, 0, 2);
```

###キーが存在するか？
```php
論理値 = array_key_exists(調べるキー, 調べる配列);
// 存在すれば「真(TRUE)」を返し、存在しなければ「偽(FALSE)」を返す。
$ary = array('name' => 'yamada','mail' => 'yamada@mail.com', 'tel' => '000-0000-0000');
if(array_key_exists('mail', $ary)){
    echo 'ある';
}else{
    echo 'なし';
}
```

###値でキーを取得する
```php
結果の配列 = array_keys(配列, 検索する値, 厳密な比較の指定)
// 配列の値を検索し、キーを配列で取得する
// 2番目の引数を指定した場合、指定した値のキーのみ取得する。（省略可）
// 3つ目の引数は「===」の比較を行うかどうかを指定する。デフォルトはfalse。（省略可）
$array = array("blue", "red", "green", "blue");
print_r(array_keys($array, "blue"));
```

###値で、最初のキーを取得する
```php
キー 又は FALSE = array_search(検索する値, 配列, 厳密な比較の指定);
// 配列の値を検索し、最初のキーを取得する
// 検索する値が文字列の場合大文字小文字が区別される
// この関数は論理値 FALSE を返す可能性があるが、FALSE として評価される値を返す可能性もある。
// 3つ目の引数は「===」の比較を行うかどうかを指定する。デフォルトはfalse。（省略可）
$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red');
$key = array_search('green', $array); // $key = 2;
```

###変数がセットされているか
```php
論理値 = isset(変数)
// 配列にも使用できる
// 配列の値がNULLの場合はfalseになる
// 空の配列はtrueになる
$array = array('first' => null, 'second' => 4);
isset($array['first']);// false を返します
isset($array['second']);// true を返します

$array = array();
isset($array);// true を返します
```

###最後のキーを取得する
```php
キー = array_key_last(配列)
// PHP 7.3.0 以上
// 内部的な配列のポインタに影響を与えない。
$array = array('a', 'b', 'c', 'd', 'e');
$key = array_key_last($array); // $key = 4;
```

###値があるか？
```php
論理値 = in_array(検索する値, 配列, TRUE);
// 3番目の引数を TRUE とした場合、型も調べる。デフォルトはfalse。（省略可）
// 検索する値が文字列の場合大文字小文字が区別される
$array = array('a', 'b', 'c', 'd', 'e');

if(in_array('a', $array)){
    echo $search.' は $array に存在します。';
}else{
    echo $search.' は $array に存在しません。';
}
```

###最後の値を取得する
```php
配列要素の値 = end(array $array);
// 配列の内部ポインタを最後の要素まで進め、要素の値を取得します。
// 空の配列の場合、FALSEを返す。
$val = array('January','February','March','April');
echo end($val);
```
##使ったことはないけど便利そう

###配列の先頭から要素を取り出して返す
```php
配列の要素 = array_shift(配列);
// 取り出された配列は要素一つ分だけ短くなり、全ての要素は前にずれる。
// 数値添字の配列のキーはゼロから順に新たに振りなおされるが、リテラルのキーには影響しない。
$array = array(1,3,5);
$result = array_shift($array);

echo $result;// 1
var_dump($array);// $arr:[3,5]
```

###配列から重複した値を削除する
```php
結果の配列 = array_unique(配列);
// 値に重複のない新規配列を返す。
// キーは保持される
$array = array(1, 2, 1, 3, 2, 5);
$result = array_unique($array);
```

###配列のキーを振り直しす。
```php
// 配列から全ての値を取り出し、数値添字をつけた配列を返す。

$array = array("size" => "XL", "color" => "gold");
$result = array_values($array);
```

###配列を分割する
```php
結果の配列 = array_chunk(配列, サイズ(要素数) [,結果の配列のキーの振り方を指定]);
// 配列を前方から、指定した要素数で分割する。
// 分割された結果は多次元配列になる。
// 3つ目の引数を「TRUE」にするとキーと要素の関係を維持出できる
$array = array('a', 'b', 'c', 'd', 'e');
$result = array_chunk($array, 2, TRUE);
```

###配列の各要素にコールバック関数を適用する。キーと値を使用できる
```php
論理値 = array_walk(配列, '関数名' ,関数の第三引数);
// 成功すると「真(TRUE)」を返し、失敗すると「偽(FALSE)」を返す。
// コールバック関数の引数を2つ設定できる。
// 第一引数は配列の値、第二引数は配列のキーが入る
// 第三引数は省略可
$array = array(10, 20, 30, 40, 50);

function AddInt($item, $key){
   echo $item + $key; 
}
array_walk($array, 'AddInt');
```

###指定した配列の要素にコールバック関数を適用する。複数の配列を扱える
```php
結果の配列 = array_map('関数名', 配列, 配列,・・・)
// 各要素に関数を適用した後、 適用後の要素を含む配列を返す。
// ２つ目以降の配列は省略可
// 二つ以上の配列を使用する場合、 それらの長さは等しい必要がある。
function cube($n)
{
    return ($n * $n * $n);
}

$a = [1, 2, 3, 4, 5];
$b = array_map('cube', $a);
print_r($b);
```

###配列の各要素にユーザ関数を適用し、フィルタリングを行う
```php
結果の配列 = array_filter(配列, '関数名', モード);
//　関数によりフィルタ処理が行われた全ての要素を含む配列を返す。
//　関数がtrueを返した場合、 処理された値が結果の配列に入る。
//　配列のキーは保存される。
//　モードのデフォルトは 0 値のみを関数の引数として渡す。
$array = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);

function Odd($var){
    //渡された整数が奇数かどうかを返します
    return($var & 1);
}
$array2 = array_filter($array, 'Odd');
```
モード
ARRAY_FILTER_USE_KEY ： 値ではなく、キーだけを callback の引数として渡す
ARRAY_FILTER_USE_BOTH ： 値だけではなく、値とキーの両方を callback の引数として渡す



###配列のキーと値を入れ替えたい
```php
結果の配列 = array_flip(入力の配列);

$array = array('a' => 1,'b' => 2, 'c' => 3);
$result = array_flip($array);
// array(3) { [１]=> 'a' [2]=> 'b' [3]=> 'c' }

```

###変数から配列を作成する
```php
結果の配列 = compact(変数名, 変数名, ・・・);
// 変数名がキー、値が要素の配列を返す
$country = 'Japan';
$capital = 'Tokyo';
$result = compact('country', 'capital');
// array(3) { ['country']=> 'Japan' ['capital']=> 'Tokyo' }
```

###連想配列を変数へ変換
```php
extract(配列, フラグ);
// キーを変数名、値を変数の値に変換する
// フラグは無効または数値キーおよび衝突に関する対処法を指定する。デフォルトはEXTR_OVERWRITE
$array = array("color" => "blue", "size" => "medium");
extract($array);
echo $color; //"blue"
echo $size; //"medium"
```
フラグ
EXTR_OVERWRITE ： 衝突があった場合、存在する変数が上書きされます。
EXTR_SKIP ： 衝突があった場合、存在する変数は上書きされません。
EXTR_PREFIX_SAME ： 衝突があった場合、prefix を前につけた新しい変数となります。第三引数が必要。
EXTR_PREFIX_ALL ： 全ての変数の前に prefix を付けます。第三引数が必要。
EXTR_PREFIX_INVALID ： 無効または数値の変数名のみに接頭辞 prefix を付けます。第三引数が必要。
EXTR_IF_EXISTS ： 現在のシンボルテーブルに既に存在する場合にのみ上書きします。
EXTR_PREFIX_IF_EXISTS ： 同じ変数だが接頭辞をつけていないバージョンの変数が 現在のシンボルテーブルに存在する場合にのみ 変数を生成します。第三引数が必要。
EXTR_REFS ： 変数を参照として展開します。 

第三引数
接頭辞を付けた変数名が有効な変数名でない場合、 この変数はシンボルテーブルにインポートされません。接頭辞は、 アンダースコア文字で配列のキーから自動的に分割されます。


###配列要素を変数に格納
```php
list(変数, 変数,・・・) = 配列;
// 配列と同様の形式で、複数の変数への代入を行う
$info = array('コーヒー', '茶色', 'カフェイン');
list($drink, $color, $power) = $info;
echo $drink;// 'コーヒー'
echo $color;// '茶色'
echo $power;// 'カフェイン'
```

###配列の一部を削除し、他の要素で置換する
```php
配列 = array_splice( 配列, 始点, 削除する要素の数, 置き換える要素を含んだ配列 )
// 配列から、始点および長さで指定された要素を削除し、配列でそれを置換する
// 第三引数、第四引数は省略可
// 削除された要素を配列として返す
$input = array("red", "green", "blue", "yellow");
array_splice($input, 2);
var_dump($input);
```

###配列の順番をランダムにする
```php
論理値 = shuffle(配列);
// 配列の要素の順番をシャッフルしてランダムにします。 成功した場合に TRUE を、失敗した場合に FALSE を返す。
// 要素に対して新しいキーを割り当てる。既存のキーは削除される。 
$array = array('a', 'b', 'c');
shuffle($array);
var_dump($array);
```


###指定した配列の 要素 を指定した 長さ と指定した 値 で埋めます。
```php
結果の配列 = array_pad(元の配列, 新しい配列のサイズ, 追加する要素の値)
// 長さが正だと右側、負だと左側の要素が埋まります。
$arr = array(2, 3, 4);
$result = array_pad($arr, 7, 10);
var_dump($result);

// array(7) { [0]=> int(2) [1]=> int(3) [2]=> int(4) [3]=> int(10) [4]=> int(10) [5]=> int(10) [6]=> int(10) }
```


##ループで処理する
###for文
```php
for(カウンタ; 条件; カウントアップ){
    処理
}
//　カウントアップはダウンでもいい。ループするたびに毎回変化する
//　配列のインデックスを使用する時には分かりやすい
$array = array(1, 2, 3, 4, 5);
for ($i = 0; $i < count($array); $i++){
    echo $array[$i];
}
```

###foreach文
```php
//　配列の要素の一つづつ取り出して処理する
foreach( 配列 as 要素の値が入る変数){
    処理
}

//　ループの中で配列の要素を直接変更したい場合は、 要素が入る変数 の前に & をつける。
foreach( 配列 as &変数){
    処理
}

//　添字も取り出す
//　連想配列のキーを扱いたいときに
foreach( 配列 as キーが入る変数 => 値が入る変数){
    処理
}

$array = array('A' => 1, 'B' =>  2, 'C' => 3, 'D' => 4, 'E' => 5);
foreach( $array as $key => $value){
    echo $key;
    echo $value;
}
```