PHPでよく使う配列操作まとめ

基礎的なもの、よく使うものをまとめてみました

# まず宣言
```php
$args = array();

$args = [];

$args = ["aaa", "bbb", "ccc"];
```
5.4からarray()ではなく、[]での宣言も可能になっています。

# ループ
```php
foreach ($args as $key => $value) {
	echo "キー : " . $key . "\n";
	echo "値 : " . $value . "\n";
	echo "\n";
}

```

```
キー : 0
値 : aaa

キー : 1
値 : bbb

キー : 2
値 : ccc
```
ちなみに\$valueの先頭に&をつけることで参照渡しが可能です。
なのでループ内で配列の要素への変更を行うことができます。
ループを抜けた後も\$valueは参照が継続しているので、ループ処理後\$valueをunsetで破棄するなどの注意が必要です。

# 値の挿入([]、push)
```php
$args = [];
$args[] = "aaa";
$args[] = "bbb";
array_push($args, "ccc");
print_r($args);
```
```
Array
(
    [0] => aaa
    [1] => bbb
    [2] => ccc
)
```
[array_push](http://php.net/manual/ja/function.array-push.php)
[]はひとつの値を、array_pushはひとつから複数の値を配列に挿入することができます。
もし配列にひとつの要素を加えるためにarray_pushを使用するなら、[]を使うことを推奨とのこと。

# 足し算、マージ
```php
$args1 = [
	"1",
	"1",
	"a" => "1",
	"b" => "1",
];
$args2 = [
	"2",
	1 => "2",
	"10" => "2",
	"a" => "2",
	"c" => "2",
];
echo "args1 + args2\n";
print_r($args1 + $args2);
echo "array_merge(args1, args2)\n";
print_r(array_merge($args1, $args2));
```
```
args1 + args2
Array
(
    [0] => 1
    [1] => 1
    [a] => 1
    [b] => 1
    [10] => 2
    [c] => 2
)
array_merge(args1, args2)
Array
(
    [0] => 1
    [1] => 1
    [a] => 2
    [b] => 1
    [2] => 2
    [3] => 2
    [4] => 2
    [c] => 2
)
```
[array_merge](http://php.net/manual/ja/function.array-merge.php)
+演算子の場合、左の配列に対して、存在しないキーの要素を追加します。
array_mergeの場合、両配列ともキーが数値のものは全て保持され、新しく0から始まる連続した数値の添字で格納されます。それ以外の同じキーの文字列を持つ要素は後ろの配列に上書きされます。


# 配列であるか
```php
$value = "test";

if (is_array($value)) {
	echo "valueは配列です\n";
} else {	
	echo "valueは配列ではありません\n";
}

$args = [];

if (is_array($args)) {
	echo "argsは配列です\n";
} else {
	echo "argsは配列ではありません\n";
}
```
```
valueは配列ではありません
argsは配列です
```
[is_array](http://php.net/manual/ja/function.is-array.php)
配列であればtrue、それ以外はfalseを返します。もちろん空配列も配列としてtrueを返します。


# 配列の要素に特定の値を含むものがあるか
```php
$args = ["aaa", "bbb", "ccc"];

if (in_array("bbb", $args)) {
	echo "bbbがargsの要素の値に存在しています\n";
} else {
	echo "bbbがargsの要素の値に存在しません\n";
}
```
```
bbbがargsの要素の値に存在しています
```
[in_array](http://php.net/manual/ja/function.in-array.php)
第一引数に指定した値が配列にあればtrue、なければfalseを返します。


# 多次元配列から特定のキーの値、キー名で返す
```php
$args = [
	[
		"year" => "2015",
		"name" => "去年"
	],
	[
		"year" => "2016",
		"name" => "今年"
	]
];
$result = array_column($args, "name", "year");
print_r($result);

```
```
Array
(
    [2015] => 去年
    [2016] => 今年
)
```
[array_column](http://php.net/manual/ja/function.array-column.php)
多次元配列において、中にある各配列のキーから値を取得できます。
第二引数に各配列の取得したいキーを設定、第三引数は設定しなければ数字の連番、設定した場合、そのキーの値がそれぞれの値のキーとして格納されます。

# 配列の要素全てに特定の処理
```php
function toDouble($value) {
	return $value * 2;
};

$args = [1, 2, 3];

$result = array_map("toDouble", $args);
print_r($result);
```
```
Array
(
    [0] => 2
    [1] => 4
    [2] => 6
)
```
[array_map](http://php.net/manual/ja/function.array-map.php)
第一引数に指定した関数名の処理を各要素に施した配列を返します。

# 特定の条件の要素のみの絞り込み
```php
function odd($value) {
	return $value % 2 === 1;
}

$args = [1, 2, 3];
$result = array_filter($args, "odd");
print_r($result);
```
```
Array
(
    [0] => 1
    [2] => 3
)
```
[array_filter](http://php.net/manual/ja/function.array-filter.php)
第二引数に指定した関数名の関数を各配列に処理し、その関数がtrueと判断できる値を返したものだけが配列に格納されます。

# 多次元配列での各配列の特定要素を用いてのソート
```php
$args = [
	[
		"year" => "2015",
		"name" => "未"
	],
	[
		"year" => "2014",
		"name" => "午"
	],
	[
		"year" => "2016",
		"name" => "申"
	]
];
array_multisort(array_column($args, 'year'), SORT_ASC, $args);

print_r($args);
```
```
Array
(
    [0] => Array
        (
            [year] => 2014
            [name] => 午
        )

    [1] => Array
        (
            [year] => 2015
            [name] => 未
        )

    [2] => Array
        (
            [year] => 2016
            [name] => 申
        )

)
```
[array_multisort](http://php.net/manual/ja/function.array-multisort.php)
array_columnで配列のソートの基準となる値を抽出して、それを基準に配列をソートしています。SORT_ASCをSORT_DESCに変更することで逆順が可能です。

# まとめてみて
PHPって色々関数があるなあと。このほかにも配列に対してソートも色々種類があったり、正規表現を使った処理を行うものなどまとめきれないのでこのくらいで。
array_mapとarray_filterのように対象の配列が関数によって引数の位置が違うのは注意しなくてはいけないところですね。