PHPにおける配列作成・分解マジック

はじめに

こんにちは、イメージ・マジックの安藤です。

オフィスに置いてあるウォーターサーバーを最も頻繁に使用している気がします。水が美味しいのは素晴らしいことです。

さて、今回は現在開発しているシステムで採用されているPHP7に関して、配列の中身を複数の変数にしたり複数の変数を配列にしたりする方法についてです。

PHPにおける配列とは

本題に入る前にPHPでの配列の扱いについて軽く触れておきます。

PHPの公式リファレンスには配列について以下のように説明されています。

PHP の配列は、実際には順番付けられたマップです。マップは型の一種で、 キーに関連付けます。

つまり、PHPには厳密には連想配列しか存在しないということです。

配列のキーには数字(整数)か文字列のみ使用でき、「数字として妥当な文字」がキーに指定された場合に数字に変換されるなどの変換法則がいくつかあります。

詳しくは公式リファレンスをご覧ください。

配列の作成

基本的にarray()を使用することで任意の配列を作成することが可能です。

PHP5.4からは[]を使うこともできます。

$data = [
 [1, 'noel'],
 [2, 'michael'],
];
$data = [
 ['id' => 1, 'name' => 'noel'],
 ['id' => 2, 'name' => 'michael'],
];

既に連想配列の値が変数として用意してあり、変数名と同じキーの配列を作りたい場合はcompact()を使うことができます。

$company = 'IMAGE MAGIC';
$state = '東京';
$city = '千代田区内神田';
print_r(compact('company', 'state', 'city'));
Array
(
  [company] => IMAGE MAGIC
  [state] => 東京
  [city] => 千代田区内神田
)

配列の分解

PHP5.xやPHP7.0では通常の配列はlist()、連想配列はextract()を使用することで実現できました。

$data = [
  [1, 'noel'],
  [2, 'michael'],
];
// $id = 1, $name = 'noel'
list($id, $name) = $data[0];

foreach ($data as list($id, $name)) {}

$data = [
  'company' => 'IMAGE MAGIC',
  'state' => '東京',
  'city' => '千代田区内神田',
];
/*
 * $company = 'IMAGE MAGIC';
 * $state = '東京';
 * $city = '千代田区内神田';
 *
*/
extract($data);

PHP7.1ではlistの代わりに[]を使うことができます。

$data = [
  [1, 'noel'],
  [2, 'michael'],
];
// $id = 1, $name = 'noel'
[$id, $name] = $data[0];

foreach ($data as [$id, $name]) {}

$data = [
  'company' => 'IMAGE MAGIC',
  'state' => '東京',
  'city' => '千代田区内神田',
];

/*
 * $company = 'IMAGE MAGIC';
 * $state = '東京';
 * $city = '千代田区内神田';
 *
*/
[
  'company' => $company,
  'state' => $state,
  'city' => $city,
] = $data;

そのほか便利な操作

  • array_keys
    連想配列のキーだけを取り出して配列にする
  • array_values
    配列を0からの添え字の配列にする
  • array_key_exists
    指定したキーが配列に存在するか調べる
  • in_array
    指定した値が配列に存在するか調べる

おわりに

PHPでは配列が作りやすいので色々と便利ではありますが、mapやfilter,reduceなどが使いにくいというが少々残念なところです。
省略できる記法は省略して可読性を上げていきたいですね。