合并两个对象并覆盖空属性(PHP)

时间:2013-07-24 06:12:45

标签: php oop

我有两个对象和我们的finder函数的工作方式(我必须调用它两次... 1来获取配置键,值即非多语言的东西。第二次调用以获取多语言的东西)使它们看起来像这样:

[config] => Array
    (
        [cfg] => Config_Model Object
            (
                [id] => 2
                [key] => system.default.main_color
                [value] => #FF7C11
                [deleted] => 0
            )

        [help] => Config_Model Object
            (
                [id] => 
                [key] => 
                [value] => 
                [id_config] => 2
                [name] => Hauptfarbe
                [help] => Die Hauptfarbe Ihres CIs. Der Adminbereich erscheint in dieser Farbe.
                [id_lang] => 1
            )

    )

我想将这两个对象合二为一。获取内容的代码如下所示:

public static function get($key)
{
  $config['cfg'] = self::find(array('key' => $key), TRUE);
  $config['help'] = self::findInTable(array(
    'id_lang' => Language_Model::getDefaultLanguage(), 
    'id_config' => $config['cfg']->getId()
  ), self::dbTranslationTable, TRUE);
  return $config;
  // return (object) array_merge((array) $config['cfg'], (array) $config['help']);
}

你可以通过注释的return命令告诉我,我尝试使用array_merge()。问题是,[help]中的空属性覆盖[cfg]中的属性,因此它们再次为空:

[config] => stdClass Object
    (
        [id] => 
        [key] => 
        [value] => 
        [deleted] => 0
        [id_config] => 2
        [name] => Hauptfarbe
        [help] => Die Hauptfarbe Ihres CIs. Der Adminbereich erscheint in dieser Farbe.
        [id_lang] => 1
    )

它应该看起来像这样:

[config] => stdClass Object
    (
        [id] => 2
        [key] => system.defalult.main_color
        [value] => #FF7C11
        [deleted] => 0
        [id_config] => 2
        [name] => Hauptfarbe
        [help] => Die Hauptfarbe Ihres CIs. Der Adminbereich erscheint in dieser Farbe.
        [id_lang] => 1
    )

如果您需要更多信息,请告诉我们。

2 个答案:

答案 0 :(得分:1)

您需要从第二个数组中过滤掉空值,然后仅将剩下的数据合并到第一个数组中。

最简单的解决方案是:

$config['help'] = array_filter((array) $config['help']);
return (object) array_merge((array) $config['cfg'], (array) $config['help']);

这使用array_filter()的默认行为,它仅检查值是否计算为false。这将删除空字符串,NULL值,甚至数字零。

更安全的解决方案实际上会检查空字符串,如下所示:

$config['help'] = array_filter((array) $config['help'], function($val) {
    return (string) $val != '';
});
return (object) array_merge((array) $config['cfg'], (array) $config['help']);

答案 1 :(得分:0)

傻傻的我......在提出问题之前,我真的应该尝试一切。对不必要的空间使用...将变量传递给array_merge()的顺序很重要!我只是转过身来,现在它看起来像这样:

return (object) array_merge((array) $config['help'], (array) $config['cfg']);

和TA-DA!该阵列看起来就像我想要的那样。

相关问题