1
/
5

【Web】PHPの配列を丁寧に理解する

ついに巷で噂のヤクルト1000を始めてみました採用担当の棚橋です。果たして効果は……。


さて、これもWebについての記事で恐縮なのですが、基礎に立ち返りまとめてみた次第です。

この記事でなくともさまざまなサイトや今時なら動画で解説や説明がされていますので何番煎じかわからないですが、ひとつ理解の助けになればと。

■ 1. 配列とは

基本的には、以下のように書かれたものをすべて「配列」と呼びます。

// 基本の形
array()

// 短縮構文
[]

大抵は後述の短縮構文で書かれることが多くなりました。ただし、PHP5.3系以下では使うことができません。案件によっては混在してしまうことがあり実装方針の共有が必要です。


■ 2. 配列の書き方

以後は短縮構文で記載していきます。以下のようにコンマで区切って列挙します。

['a', 'b', 'c']

長いと以下のように改行されることもありますが人間の見やすさによるものです。

[
  'a',
  'b',
  'c',
]

見やすくするために以下のようにそれらしいまとまりごとに改行することもありますが稀です。

[
  'jpg', 'jpeg', 'png', 'gif',
  'mp4', 'mov'
  'ogg', 'mp3', 'midi'
]

詰めて書いたり2つ以上の半角スペースを用いることもできますが、大抵半角スペース1つです。

['a','b','c']

['a',  'b',  'c']

// あまり見かけない

最後のコンマはPHPでは付けても付けなくてもどちらでも良いですが、1行の時は付けず、改行されていれば付ける、ということが多い気はします。

改行されている場合最後のコンマをつけておけば、あとで配列が追加となってもgitの差分が1行だけになるのでレビュー時に見やすい、という見方もあります。

['a', 'b', 'c',]

[
  'a',
  'b',
  'c'
]

// あまり見かけない

これもあまり見かけないですが、型が揃っていなかったり、変数や関数を入れたりも可能です。ただ、わかりにくいですね……。

['a', 100, $a, a(), $this->a()]

※ PHPMDやPHPCSなどのコーディングルールについては本記事では割愛します。


■ 3. 配列の利点

配列は変数の中に変数を入れたような役割を持ちますので、例えば以下のようにたくさんの変数で管理するより、

$hoge1 = 'a';
$hoge2 = 'b';
$hoge3 = 'c';
・・・ 略 ・・・
$hoge24 = 'x';
$hoge25 = 'y';
$hoge26 = 'z';

以下のようにひとまとめにするほうがソースも綺麗ですし管理もしやすいです。

$hoges = ['a', 'b', 'c', ・・・ 略 ・・・, 'x', 'y', 'z'];

関数の引数にする時に綺麗になりますね。

function a($hoge1, $hoge2,  $hoge3, ・・・ 略 ・・・ $hoge26) { // hogehoge }

↓

function a($hoges) { // hogehoge }

※ 可変長引数にするという作戦もありますがここでは割愛します。


■ 4. 配列の種類

PHPに限って言えば、大きく分けて2種類あります。

4-1. 単配列

以下のような形のものです。

[0 => 'a', 1 => 'b', 2 => 'c']

「インデックス配列」と呼ばれたりもしますが、いまいち後述の「連想配列」のように定着した名称が無いので、単に「配列」と呼ぶこともありこれがミスリードしがちです。

文脈から「広義の配列」の話なのか、「狭義の配列」の話なのかを判断する必要があります。


=> を「ダブルアロー演算子」と呼びます。また、この左にある数字を「添字」もしくは「キー(key)」と呼び、右にある列挙したいものを「要素」もしくは「バリュー(value)」と呼びます。

暗黙的に添字は0から始め、「0番目の要素」「1番目の要素」……と呼びます。

添字は省略することもできますので、これまで例示で使われていた配列は「単配列の添字省略版」だったというわけです。

['a', 'b', 'c']


4-2. 連想配列

以下のような形のものです。

['hoge1' => 'a', 'hoge2' => 'b', 'hoge3' => 'c']

「0が何で、1が何で、2が何で……」と人間が覚えておくのは難しいです。そのため、「連想」できるように名前をつけた配列、というふうな具合です。

「ダブルアロー演算子」、「添字」、「要素」という呼び名は同じで、添字が数字ではなく文字列になっているという点が、単配列との大きな違いです。

以下のように混在させることもできはしますが、パッと見の時点でわかりにくいですね。実際の案件ではまず使わないので気にしなくて良いです。

['hoge1' => 'a', 2 => 'b', '3' => 'c']


■ 4. 配列内にある要素の使い方

以下はエラーになります。

$hoges = ['a', 'b', 'c'];
echo $hoges;

// → Array to string conversion というエラー文が表示されることも

そのため、添字を[]で囲んだものを変数の右に付けることで扱うことができます。

$hoges = ['a', 'b', 'c'];
echo $hoges[0];

// → a と表示されます

もちろん連想配列でも本質は同じです。

$hoges = ['hoge1' => 'a', 'hoge2' => 'b', 'hoge3' => 'c'];
echo $hoges['hoge1'];

// → a と表示されます

※ 他にも array_slice関数を使用する作戦もありますがここでは割愛します。


なお、無い添字を[]内に入れるとエラーになります。

$hoges = ['hoge1' => 'a', 'hoge2' => 'b', 'hoge3' => 'c'];
echo $hoges['hoge4'];

// → Undefined offset: X というエラー文が表示されることも


■ 5. 配列内の要素を繰り返す

配列とは直接関係ないですが、配列と関係が深い foreach 文も補足です。

以下のようにforeach文の{}で、配列を0番目から順番にasの右にある変数に代入します。

$hoges = ['a', 'b', 'c'];
foreach ($hoges as $row) {
  echo $row;
}

// → abc と表示されます。

好みですが、row という変数名を用いることが多いです。


以下のように添字も繰り返すこともできます。こちらは連想配列で使われることが多いですが、単配列でももちろん使用できます。

$hoges = ['hoge1' => 'a', 'hoge2' => 'b', 'hoge3' => 'c'];
foreach ($hoges as $key => $value) {
  echo $key . $value . '|';
}

// → hoge1a|hoge2b|hoge3c と表示されます。

$hoges = ['a', 'b', 'c'];
foreach ($hoges as $key => $value) {
  echo $key . $value . '|';
}

// → 0a|1b|2c と表示されます。

※ | はechoの結果がわかりやすいようにしているだけです。本旨とは関係ないです。

好みですが、key、valueという変数名を用いることが多いです。


ほんとは多次元配列や配列同士の組み合わせなどまだいろいろあるのですがこのあたりでご容赦を……。


わかりきったことも、丁寧に理解することで時には前に進めることもあります。

「可能だけどやらないよね」という暗黙知がいくつかあるので、若干このあたりがPHPの好まない部分なのかもしれません。他の言語だとエラーになる書き方もあるかと。


なにより重要なのは、付け焼き刃ややっつけでないリソースで実務にあたっていくことです。

もちろん情報工学の専門家になって論文を学会で発表するほど深く理解する必要はないですし、場合によてはその案件の予算や利益率を加味して、理解より速度を優先する場合も時にはあります。


しかしながら技術者としてのキャリアパスであれば、妥協のない専門性を備えた姿勢が望ましいかと思います。


[素材]

[参考サイト]

株式会社エイルシステム's job postings
1 Likes
1 Likes

PHP

Weekly ranking

Show other rankings
Like 棚橋 政博's Story
Let 棚橋 政博's company know you're interested in their content