開発をしていて、未定義のキーや属性でのアクセスエラーは誰しも経験します。

配列のキー(price)が未定義なら、

>>> $p1 = ['name' => 'apple'];
=> [
     "name" => "apple",
   ]
>>> $p1['name'];
=> "apple"
>>> $p1['price'];
PHP Notice:  Undefined index: price in Psy Shell code on line 1

オブジェクトの属性(price)が未定義なら、

>>> $p2 = (object)['name' => 'apple'];
=> {#2318
     +"name": "apple",
   }
>>> $p2->name;
=> "apple"
>>> $p2->price;
PHP Notice:  Undefined property: stdClass::$price in Psy Shell code on line 1

なんのことはない、このような場合は、未定義のpriceを初期化してあげればよいですね。

しかし、この初期化、都合によってはできないときあります。画面のフォームにおいて条件によりpriceの入力をするときと、しないときがあるとか。

そのときには、isset()の関数を使用して、キーや属性が定義されているかどうかをチェックします。

>>> isset($p1['name']);
=> true
>>> isset($p1['price']);
=> false
>>> isset($p2['name']);
=> true
>>> isset($p2->price);
=> false

そして、未定義のエラーを出さずにデフォルトの値を割り当てたいなら、三項演算子を利用します。

>>> $name = isset($p1['name']) ? $p1['name'] : '';
=> "apple"
>>> $price = isset($p1['price']) ? $p1['price'] : 0;
=> 0
>>> $name = isset($p2->name) ? $p2->name : '';
=> "apple"
>>> $price = isset($p2->price) ? $p2->price : 0;
=> ""

繰り返しの記述が面倒なら、Laravelでは便利なヘルパーあります:array_get(), data_get()

>>> $name = array_get($p1, 'name', '');
=> "apple"
>>> $price = array_get($p1, 'price', 0);
=> 0
>>> $name = data_get($p2, 'name', '');
=> "apple"
>>> $price = data_get($p2, 'price', 0);
=> 0

そして、php7なら、Null合体演算子を利用しても同様なことができます。

>>> $name = $p1['name'] ?? '';
=> "apple"
>>> $price = $p1['price'] ?? 0;
=> 0
>>> $name = $p2->name ?? '';
=> "apple"
>>> $price = $p2->price ?? 0;
=> 0

By khino