[PHP] 配列の+(プラス)演算子は便利
- 2008-06-24
- カテゴリ: Server Side
- タグ: PHP トラックバック
久しぶりにPHPの話題。
確かにPHPの配列の加算演算子はとても醜い仕様だと思う。
問. 配列を+(プラス)演算子で加算すると? : アシアルブログ
<?php $fruit1 = array('apple', 'banana', 'cherry'); $fruit2 = array('kiwi', 'lemon', 'melon'); $fruit = $fruit1 + $fruit2; ?>$fruitの値は次のA〜Cのどれになるでしょうか?
A. array('apple', 'banana', 'cherry') B. array('apple', 'banana', 'cherry', 'kiwi', 'lemon', 'melon') C. array('kiwi', 'lemon', 'melon')(中略)
正解は「A」です!
(中略)
ちなみに、私はてっきり「B」になるものと思ってました……。
+演算子の不思議な挙動も、配列と連想配列を一緒くたに扱うことから始まるPHPの悲劇の一つだと思うが、個人的にはとても大好きな仕様だったりする。特に↓のような使い方を頻繁に使うようになると手放せなくなる。
連想配列の初期値を保証する
関数にオプション配列を渡して関数の挙動を変えるというのは、PHPではよく使われるテクニックですが、↓のようなコードを書くとそのオプション配列のデフォルト値を保証できて便利。
function someFunction($options)
{
$options += array('foo' => 'FooFooFoo',
'bar' => 'BarBarBar',
'baz' => 'BazBazBaz');
//...
↑のコードは、↓のコードとほぼ同じ働きをします。
function someFunction($options)
{
if (!isset($options['foo']))
$options['foo'] = 'FooFooFoo';
if (!isset($options['bar']))
$options['bar'] = 'BarBarBar';
if (!isset($options['baz']))
$options['baz'] = 'BazBazBaz';
//...
最初にオプション配列に初期値配列を加算してしまえば、いちいちisset()をかませなくてもNoticeが飛ばなくなるし、その上、関数の最初にデフォルト値が列挙してあれば、その関数が受け取るオプション値を確認しやすくて便利。
配列の長さを保証する
explode()なんかを使うときに、↓のような書き方をよくします。
list($prefix, $name) = explode('.', $str, 2) + array('prefix', 'name');
explode()は第3変数$limitを指定すれば、返り値の配列の長さの上限を設定することはできるけど、下限を設定することができない。でも、↑のように長さ2の配列を加算してしまえば、必ずlist($prefix, $name)に値がセットされることが保証できます。↑のコードは↓のコードとほぼ同じ働きをしますね。
$tmp = explode('.', $str, 2);
$prefix = isset($tmp[0]) ? $tmp[0] : 'prefix';
$name = isset($tmp[1]) ? $tmp[1] : 'name';
まとめ
PHPの配列加算演算子は便利。余計なif文やisset()関数を減らすことができる。PHPにしては珍しく、プログラムコードを減らす方向に働いてくれる機能だと思う。
とはいえ、JavaScript等で用いられる「値を返す||(or)演算子」があれば、↑で挙げたような気持ち悪い+演算子の使い方は減らせるんだけどなorz
おまけ
PHPの配列加算演算子といい、JavaScriptの文字列結合演算子といい、なんで+(プラス記号)は気持ち悪いオーバーロードのされ方ばかりするんだろう。
関連記事
トラックバック URL
- http://liosk.blog103.fc2.com/tb.php/125-dace5396
トラックバック
- PHPの配列結合演算子+(プラス)について考えてみた
-
配列結合演算子は「連想配列の継承」なのだという悟りが啓けたのでまとめてみました。
- 2009-07-21
- 発信元: 泥のように