循环通过未知的数组键/测试丢失的键

时间:2014-06-12 11:05:26

标签: php arrays associative-array

我正在尝试建立一个结构,其中关联数组包含我的模板的键/值数据。

我希望能够应用默认数据,但下面的代码有一些明显的问题。首先,这是一个麻烦的写作重复的东西。第二 - 如果根本没有定义键,则null的测试不起作用,那么你只是得到一个错误,说明没有定义键'background_color'。

我最好如何构建这样的结构?

//Defaults for this template
$default = array();
$default['background_color'] = '#ffffff';
$default['background_image'] = '';
$default['background_opacity'] = '1.0';
$default['background_repeat'] = '';
$default['background_position-horizontal'] = 'left';
$default['background_position-vertical'] = 'top';
$default['background_size'] = '';

if($data['background_color'] == null) { $data['background_color'] = $default['background_color']; }
if($data['background_image'] == null) { $data['background_image'] = $default['background_image']; }
if($data['background_opacity'] == null) { $data['background_opacity'] = $default['background_opacity']; }
if($data['background_repeat'] == null) { $data['background_repeat'] = $default['background_repeat']; }
if($data['background_position-horizontal'] == null) { $data['background_position-horizontal'] = $default['background_position-horizontal']; }
if($data['background_position-vertical'] == null) { $data['background_position-vertical'] = $default['background_position-vertical']; }
if($data['background_size'] == null) { $data['background_size'] = $default['background_size']; }

3 个答案:

答案 0 :(得分:1)

//Defaults for this template
$default = array();
$default['background_color'] = '#ffffff';
$default['background_image'] = '';
$default['background_opacity'] = '1.0';
$default['background_repeat'] = '';
$default['background_position-horizontal'] = 'left';
$default['background_position-vertical'] = 'top';
$default['background_size'] = '';

foreach ($default as $k => $v) {
    if (!isset($data[$k])) {
        $data[$k] = $default[$k];
    }
}

答案 1 :(得分:1)

使用isset,并使用foreach

遍历默认值
foreach ($default as $key => $val) {
    if (!isset($data[$key]) {
        $data[$key] = $val;
    }
}

如果值为null,则Isset返回false,因此您不需要额外检查null。

答案 2 :(得分:0)

我总是采用'默认'方案的方式是:

$data = (array)$data + (array)$default;