Предположим, что мы хотим пройти через многомерный массив сообщений об ошибках $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."
}
}
Извините за мой английский, все, кто его прочитал, благодарит вас за ваше терпение! Дайте мне знать, если вы не понимаете какую-то часть моего вопроса.
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);
Надеюсь это поможет.
$result
var, а не original$arr
?