0

我有两个对象,以及我们的 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']);
}

您可以通过注释的返回命令判断我尝试使用 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
    )

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

4

2 回答 2

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']);
于 2013-07-24T06:16:17.347 回答
0

愚蠢的我......我真的应该在提问之前尝试一切。对不起,不必要地使用空间......你如何将变量传递给 array_merge() 的顺序很重要!我刚把它转过来,现在它看起来像这样:

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

还有TA-DA!该数组看起来就像我想要的那样。

于 2013-07-24T06:16:13.973 回答