この記事は 株式会社サイバー・バズ Advent calendar 2021 13日目の記事です。
11日目の記事は GoogleAppsScript(GAS)で効率化する時になんだかんだよく使うコードスニペット10選 、
14日目の記事は マイクロサービスアーキテクチャにおけるProtocolBuffers管理のGitHubActionsフローを実現した です。
PHP 初学者向けの記事です。
本記事では**「配列とオブジェクトを完全に理解した」状態**になるため必要な
- PHP における配列とオブジェクトがなんなのか
- それぞれの値の取り出し方
についてまとめました。
配列
複数の値をまとめて管理することのできる型です。
array([値1], [値2], ...)
で作成することができます。
以下の説明では「車」を例として扱います。
引用元:自動車はどんな部品で構成されているのですか? | JAF
車を構成する要素
- body
- chassis
- engine
- drivetrain
の4つを持つ配列$car
を宣言します。
<?php
$car = array(
'body',
'chassis',
'engine',
'drivetrain',
);
body
, chassis
, engine
, drivetrain
, が配列$car
の値になります。
このときvar_dump($car)
の出力結果は、
array(4) {
[0]=>
string(4) "body"
[1]=>
string(7) "chassis"
[2]=>
string(6) "engine"
[3]=>
string(10) "drivetrain"
}
となります。
配列 $car
には
- 0番目に
body
- 1番目に
chassis
- 2番目に
engine
- 3番目に
drivetrain
の値が格納されています。
特定の値の取り出し方
**「0番目の値を取り出したい!」**という時には
$car[0]
と、配列の後ろで[0]
のように番号指定することによって
string(4) "body"
特定の値を取り出すことができます。
連想配列
先述した配列を扱いやすく宣言したものです。
<?php
$car = array(
'body' => 'ボンネットやトランクリッド',
'chassis' => '足回り関連',
'engine' => 'エンジン',
'drivetrain' => '駆動系部品',
);
この場合、
ボンネットやトランクリッド
, 足回り関連
, エンジン
, 駆動系部品
, が連想配列$car
の値で、
body
, chassis
, engine
, drivetrain
, は連想配列$car
のキーと呼びます。
このときvar_dump($car)
の出力結果は、
array(4) {
["body"]=>
string(39) "ボンネットやトランクリッド"
["chassis"]=>
string(15) "足回り関連"
["engine"]=>
string(12) "エンジン"
["drivetrain"]=>
string(15) "駆動系部品"
}
となります。
連想配列 $car
には
- キー
body
にボンネットやトランクリッド
- キー
chassis
に足回り関連
- キー
engine
にエンジン
- キー
drivetrain
に駆動系部品
が格納されています。
特定の値の取り出し方
連想配列では、キーによって取り出す値を指定します。
**「キーbody
の値を取り出したい!」**という時には
$car['body']
と、配列の後ろでキーを指定することによって
string(39) "ボンネットやトランクリッド"
特定の値を取り出すことができます。
多次元配列
ネストされた配列(配列、連想配列が入れ子になっているもの)のことです。
<?php
$car = array(
'chassis' => array(
'suspension' => 'サスペンション',
'steering' => 'ステアリング',
'tire' => 'タイヤ',
'wheel' => 'ホイール',
),
'drivetrain' => array(
'transmission' => 'トランスミッション',
'driveshaft' => 'ドライブシャフト',
'differential' => 'デファレンシャル',
),
);
var_dump($car)
の出力結果は、
array(2) {
["chassis"]=>
array(4) {
["suspension"]=>
string(21) "サスペンション"
["steering"]=>
string(18) "ステアリング"
["tire"]=>
string(9) "タイヤ"
["wheel"]=>
string(12) "ホイール"
}
["drivetrain"]=>
array(3) {
["transmission"]=>
string(27) "トランスミッション"
["driveshaft"]=>
string(24) "ドライブシャフト"
["differential"]=>
string(24) "デファレンシャル"
}
}
となります。
特定の値の取り出し方
ファイルのディレクトリのように、キーを続けて記述することで取り出すことができます。
たとえば、
$car['drivetrain']['transmission']
と指定した場合は
string(27) "トランスミッション"
の値を取り出すことができます。
オブジェクト
オブジェクトを生成するためには、まずクラスを宣言する必要があります。
宣言方法は、
class クラス名
{
[クラスの中身]
}
です。車の例を使って実際に宣言してみます。
<?php
class Car
{
public $body = 'ボンネットやトランクリッド';
public $chassis = '足回り関連';
public $engine = 'エンジン';
public $drivetrain = '駆動系部品';
}
書き方がかなり変わりました。
ここの $body
$chassis
等はプロパティと呼ばれます。
気になる人向け:`public`とは?
アクセス修飾子です。そのプロパティ等がどこからアクセス可能化を表します。 他に `private` `protected` があります。では Car
を出力してみましょう。
Car
をオブジェクトとして出力するには**new
演算子を用いてインスタンス化**する必要があります。
$car = new Car();
これで $car
を生成できました。
var_dump($car)
の出力結果は、
object(Car)#1 (4) {
["body"]=>
string(39) "ボンネットやトランクリッド"
["chassis"]=>
string(15) "足回り関連"
["engine"]=>
string(12) "エンジン"
["drivetrain"]=>
string(15) "駆動系部品"
}
となります。
出力の形が連想配列と似ていますね。
特定の値の取り出し方
オブジェクトから特定の値を取り出す方法は、配列と異なります。
出力形が連想配列と似ていますが、キーの指定による出力はできません。
(オブジェクトにはキーが存在しないため)
オブジェクトの場合はプロパティにアクセスし、値を取り出します。
**「プロパティ$body
の値を取り出したい!」**という時には
$car->body
->
というアロー演算子 を用いてアクセスします。
var_dump($car->body)
の出力結果は
string(39) "ボンネットやトランクリッド"
となります。
まとめ
最初は混乱しがちな配列とオブジェクトについて基本をおさらいしてみました。
PHP を初めたばかりの方は、
- 配列→キーを用いて取り出す
- オブジェクト→アロー演算子を用いてプロパティにアクセスし、取り出す
と、値の取り出し方が違うことを意識しておくと良いかと思います。
また、型の確認漏れを防ぐには**var_dump
を用いてarray
なのかobject
なのかをチェックする**ことがオススメです。
今回記載した他にも、オブジェクトの場合はクラス内でメソッドが記述出来るなどの大きな違いがあります。
配列とオブジェクトの取り扱いに慣れてきた方は、そちらをおさえると一歩前に進めると思います。
参考
- 小川雄大,柄沢聡太郎,橋口誠「パーフェクトPHP」(技術評論社、2010年)
- PHP: 配列 - Manual
- PHP: クラスの基礎 - Manual
- PHP: オブジェクト - Manual
- 【PHP】オブジェクトを連想配列に変換する方法まとめ - Qiita
- 【PHP】オブジェクトと連想配列の違い - Qiita
- 配列とオブジェクトの違いについて - Qiita
- [【PHP】クラスの基本 | インスタンス | プロパティとメソッド | オブジェクト指向 - Qiita](【PHP】クラスの基本 | インスタンス | プロパティとメソッド | オブジェクト指向)
- 【PHP】オブジェクトと連想配列の違いについて調べてみた【初心者向け】 | もんプロ~問題発見と解決のためのプログラミング〜