PHPで連想配列にkeyが存在したら値を追加しない、存在しなければ値を追加する、の書き方
たまたまCakePHPのFilelLogエンジンのソースを見ていたら
$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で確認しちゃってた。