Php 比较数组中的差异并添加不存在的键 熟悉情况

Php 比较数组中的差异并添加不存在的键 熟悉情况,php,multidimensional-array,array-difference,Php,Multidimensional Array,Array Difference,让我们假设我们要使用以下结构遍历错误消息的多维数组$errors …并将其与一系列已发布的语言版本进行比较: 此外,还有一种默认语言。这是主要和首选语言: 目标 我所需要做的就是找出任何错误是否不包含任何语言版本,除了默认版本。 我认为一种方法是使用函数array\u diff()或该函数的一些快照。但是现在我有以下循环代码,如果有更好的建议,我将不胜感激: 所需结果: array(2) { ["app_cannot_run"]=> array(2) { ["ces"]=&g

让我们假设我们要使用以下结构遍历错误消息的多维数组
$errors

…并将其与一系列已发布的语言版本进行比较:

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


目标 我所需要做的就是找出任何错误是否不包含任何语言版本,除了默认版本。 我认为一种方法是使用函数
array\u diff()
或该函数的一些快照。但是现在我有以下循环代码,如果有更好的建议,我将不胜感激:

所需结果:

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."
  }
}
对不起,我的英语,所有读到这里的人,谢谢你们的耐心!☺ 如果你不明白我问题的某些部分,请告诉我。

来解围:

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

希望这能有所帮助。

您好,首先感谢您的回复。不幸的是,我不得不说它没有帮助,因为我仍然有一个没有补充元素的数组。我不知道为什么,但我继续检查它。你确定你检查了
$result
var,而不是原始
$arr
?你是对的!非常感谢你!你刚刚救了我的青春☺很顺利,很好。
$default_language = 'ces';
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."
  }
}
$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);