PHPで連想配列にkeyが存在したら値を追加しない、存在しなければ値を追加する、の書き方

たまたまCakePHPFilelLogエンジンのソースを見ていたら

		$options += array('path' => LOGS);

という書き方があって「あれ、この書き方知らない」となったので確認した。



結果はタイトル通り、「keyがあれば何もしない、keyがないなら値を追加する」だった。

<?php
$options = array();
$options += array('path' => 'LOGS');
var_dump($options);
// array(1) {
//   ["path"]=>
//   string(4) "LOGS"
// }

$options = array('path' => null);
$options += array('path' => 'LOGS');
var_dump($options);
// array(1) {
//   ["path"]=>
//   NULL
// }

$options = array('path' => '');
$options += array('path' => 'LOGS');
var_dump($options);
// array(1) {
//   ["path"]=>
//   string(0) ""
// }

$options = array('path' => 'DEFAULT_LOGS');
$options += array('path' => 'LOGS');
var_dump($options);
// array(1) {
//   ["path"]=>
//   string(12) "DEFAULT_LOGS"
// }

わーわー、こんな便利な書き方あったのかー。今までif (isset($options['LOGS']))みたいな感じで確認してたよー。
ちゃんと基本からやらないとダメだなぁと思ったいい例。

追記

あとで自分で見た時に「複数keyの時はどうなるんだっけ?」ってなりそうだからそれも書いておく。



例えば、ユーザがいじれるオプションが3つあったとして、それを引数で受け取る場合に
「ユーザから与えられなかったオプションについては初期値を入れる」
ってことをやりたい場合は以下のような感じになる。

<?php
function method($options) {
    $options += array(
        'is_option1' => false,
        'is_option2' => false,
        'is_option3' => false,
    );  

    var_dump($options);
}

method(array(
    'is_option1' => true,
    'is_option3' => true,
));


// var_dumpの結果
// 
// array(3) {
//   ["is_option1"]=>
//   bool(true)
//   ["is_option3"]=>
//   bool(true)
//   ["is_option2"]=>
//   bool(false)
// }

option1,2,3の初期値がfalseで、ユーザがoption1,3をtrueにしているイメージ。



今まではひとつずつissetで確認しちゃってた。