Edited at

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);

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