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

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

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

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

0

Решение

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

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

1

Другие решения

Других решений пока нет …