LoginSignup
3
0

More than 1 year has passed since last update.

[PHP 初学] 配列とオブジェクトの違いについて「完全に理解した」状態にする

Last updated at Posted at 2021-12-13

この記事は 株式会社サイバー・バズ 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]のように番号指定することによって

0番目のvar_dump出力
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']

と、配列の後ろでキーを指定することによって

キーbodyのvar_dump出力
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']

と指定した場合は

var_dump出力
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) の出力結果は

var_dump出力
string(39) "ボンネットやトランクリッド"

となります。

まとめ

最初は混乱しがちな配列とオブジェクトについて基本をおさらいしてみました。

PHP を初めたばかりの方は、

  • 配列→キーを用いて取り出す
  • オブジェクト→アロー演算子を用いてプロパティにアクセスし、取り出す

と、値の取り出し方が違うことを意識しておくと良いかと思います。

また、型の確認漏れを防ぐにはvar_dumpを用いてarrayなのかobjectなのかをチェックすることがオススメです。

今回記載した他にも、オブジェクトの場合はクラス内でメソッドが記述出来るなどの大きな違いがあります。
配列とオブジェクトの取り扱いに慣れてきた方は、そちらをおさえると一歩前に進めると思います。

参考

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0