PHP
cakephp2

Configure::load()で同じファイルを複数回読みこむと配列が増える(゜ロ゜)

config.php
$config['target'] = [
    'foo' => ['foo1', 'foo2'],
    'bar' => ['bar1', 'bar2']
];

こんな設定を用意しておいて、利用したいところで

Configure::load('config');
$config = Configure::read('target');

ってコードで読み取りすることってあると思うんですが、これ、複数実行すると配列が増えます!(゜ロ゜)

Configure::load('config');
$config = Configure::read('target');
debug($config);

Configure::load('config');
$config = Configure::read('target');
debug($config);
/*
ここでは
[
    'foo' => ['foo1', 'foo2', 'foo1', 'foo2'],
    'bar' => ['bar1', 'bar2', 'bar1', 'bar2']
]
*/

少しコードみただけですが、Configure::load()内でHash::merge()実行してるようなので、連想配列なら上書き、数値添えの配列なら追加になるんだと思われます。

複数のテストを連続実行させたらConfigure::load()で同名ファイル読みこみを複数実行したようで、発見できました。

というわけでCakePHP2でCongigure::read()つかうときは、列挙したいだけでも数値添え字配列は避けた方が良さそうです。

さっきのコードなら

config.php
$config['target'] = [
    'foo' => ['foo1' => 'foo1', 'foo2' => 'foo2'],
    'bar' => ['bar1' => 'bar1', 'bar2' => 'bar2']
];

とするか

config.php
$config['target'] = [
    'foo' => ['foo1' => true, 'foo2' => true],
    'bar' => ['bar1' => true, 'bar2' => true]
];

こんな感じにして array_keysで読むかってところでしょうか。

追記

config.php
if (!Configure::check('target')){
    $config['target'] = [
        'foo' => ['foo1', 'foo2'],
        'bar' => ['bar1', 'bar2']
    ];
}

これもありか

あるいはloadの第3引数がマージオプションになってるようなのでそっちで

Configure::load('config', 'default', false);

うん。どれもスッキリしない^^;