比较数组中的差异并添加不存在的键

时间:2014-11-20 15:09:34

标签: php multidimensional-array array-difference

熟悉情况

我们假设我们希望通过以下结构来处理多维错误消息 $errors ...

array(2) {
  // $id
  ["app_cannot_run"]=> array(2) {
    // $l
    ["ces"]=> string(36) "Webová aplikace nemůže být spuštěna."
    ["eng"]=> string(39) "The web application can not be started."
  }
  ["missing_file"]=> array(1) {
    ["ces"]=> string(32) "Požadovaný soubor nebyl nalezen."
  }
}

...并将其与已发布语言版本的数组进行比较:

$available_languages = array('ces','eng');

此外,还有一种默认语言。这是主要和首选语言:

$default_language = 'ces';

目标

我需要做的就是找出任何错误是否包含除默认语言之外的任何语言版本。 我认为一种方法是使用函数 array_diff() 或此函数的某些功能。但此时我有以下代码和循环,我将不胜感激任何建议做得更好:

foreach ($errors as $e => $id){
  foreach ($available_languages as $l){
    if (!array_key_exists($l,$id)){
        if ($l != $default_language){
          $alt_err_ver = $id[$default_language];
          $id[$l] = $alt_err_ver;
              /*
                 here comes a problem because I can save an alternative
                 language version of error into an array, but only for
                 an iteration (it's not going to printed after foreach loop).
              */
        }
    }
  }
}

print_r($errors);

所需的结果:

array(2) {
  ["app_cannot_run"]=> array(2) {
    ["ces"]=> string(36) "Webová aplikace nemůže být spuštěna."
    ["eng"]=> string(39) "The web application can not be started."
  }
  ["missing_file"]=> array(2) {
    ["ces"]=> string(32) "Požadovaný soubor nebyl nalezen."
    ["eng"]=> string(32) "Požadovaný soubor nebyl nalezen."
  }
}

对不起我的英文,所有在此阅读的人都感谢您的耐心等待! ☺ 如果你不理解我问题的某些部分,请告诉我。

1 个答案:

答案 0 :(得分:1)

array_map来救援:

$default_lang = 'ces';
$availables = array('ces','eng');

$result = array_map(function($el) use($default_lang, $availables) { 
  foreach($availables as $lang) {
    if(!array_key_exists($lang, $el)) { // no translation!
      $el[$lang] = $el[$default_lang];  // set to copy of default
    }
  }
  return $el; // return updated
}, $arr);

希望这有帮助。