LoginSignup
1
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-09-11
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);

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0