сложный поиск в массиве php

#php #arrays

#php #массивы

Вопрос:

У меня есть такой массив:

 [0] =>
   ['lang'] => 'DE',
   ['message'] => 'some text'
[1] =>
   ['lang'] => 'EN',
   ['message'] => 'some text'
[2] =>
   ['lang'] => 'NZ',
   ['message'] => 'some text'
[3] =>
   ['lang'] => 'CH',
   ['message'] => 'some text'
  

и предложение, подобное этому, если $lang = 'NZ' не найдено, найдите и верните сообщение для $default_lang = 'DE' , иначе верните сообщение для 'NZ'

моя реализация:

 foreach($res_arr as $key => $value) {
    if ($res_arr[$key]['lang'] == $lang) {
        return $res_arr[$key]['message'];
    }
}

foreach($res_arr as $key => $value) {
    if ($res_arr[$key]['lang'] == $default_lang) {
        return $res_arr[$key]['message'];
    }
}
  

есть ли лучший способ сделать это?

Комментарии:

1. Быстрая идея: если возможно, создайте массив, чтобы в качестве ключей использовались коды языков. Затем вы можете проверить, есть ли в вашем массиве запись для определенного языка.

Ответ №1:

Попробуйте с:

 $lang = ''; // lang param
$default_lang = 'DE';
$languages = array(
  'DE' => 'some text',
  'EN' => 'some text',
  'NZ' => 'some text',
  'CH' => 'some text'
);

if ( !isset($languages[$lang]) ) {
  $lang = $default_lang;
}
$message = $languages[$lang];
  

Редактировать

Способ преобразования вашего массива в мой $languages массив:

 $languages  = array();
$your_array = array( /* your data */ );

foreach ( $your_array as $val ) {
  $languages[ $val['lang'] ] = $val['message'];
}
  

Комментарии:

1. это самый быстрый метод, который я знаю, но сначала я каким-то образом должен преобразовать свой массив в ваш, и я не знаю, как это сделать.

Ответ №2:

Я сомневаюсь, будет ли array_search работать здесь, т.Е. На многомерном массиве. В любом случае, вот мое решение:

 $default_lang_msg = '';
foreach($res_arr as $key => $value) {
    if ($res_arr[$key]['lang'] == $lang) {
        return $res_arr[$key]['message'];
    }
    else if ($res_arr[$key]['lang'] == $default_lang) {
        $default_lang_msg = $res_arr[$key]['message'];
    }    
}

return $default_lang_msg;
  

кстати, массив с кодом языка в качестве ключей — это правильный путь, если вы можете позволить себе изменить то же самое.