Давайте предположим, что мы хотим пройти через многомерный массив сообщений об ошибках $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);
Надеюсь это поможет.
Других решений пока нет …