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


Compare differences in arrays and add non-existent keys

熟悉情况

假设我们想使用以下 结构$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."
  }
}

对不起我的英语,所有读到这里的人都感谢您的耐心等待! ☺如果您不理解我问题的某些部分,请告诉我。

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);

希望这有帮助。