Сравните различия в массивах и добавьте несуществующие ключи

0

Ознакомление с ситуацией

Предположим, что мы хотим пройти через многомерный массив сообщений об ошибках $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 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."
  }
}

Извините за мой английский, все, кто его прочитал, благодарит вас за ваше терпение! Дайте мне знать, если вы не понимаете какую-то часть моего вопроса.

Теги:
multidimensional-array
array-difference

1 ответ

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

Надеюсь это поможет.

  • 0
    Привет, сначала спасибо за ответ. К сожалению, я должен сказать, что это не помогло, потому что у меня все еще есть массив без дополнительного элемента. Понятия не имею почему, но я продолжаю это проверять.
  • 1
    Вы уверены, что проверили $result var, а не original $arr ?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню