Найти совпадающий ключ в двух ассоциированных массивах?

Я использую codeigniter, и у меня есть возвращенный связанный массив из БД, как это:

 $result = ['name'=>'john', 'author'=>'smith', 'year'=>2011 ];

И длинный список переведенных заголовков для ключей, сохраненных в виде массива, например:

$lang = ['name'=>'名字', 'author'=>'作者', 'year'=>'年份', ... ];

Я хотел сравнить ключ $result с $lang, если ключ был использован в $result, получить его переведенное название. И, наконец, создайте массив, включающий все три английских заголовка, переведенный заголовок и значение:

$lang_result = ['name'   =>['名字', 'john'],  
                'author' =>['作者', 'smith'],  
                'year'   =>['年份', 2011] ]

$data['result'] = $lang_result;

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

echo "{$result['name'][0]}:  {$result['name'][1]} "; // 名字: john
echo "{$result['author'][0]}:  {$result['author'][1]} ";

До сих пор я мог достичь этого только с помощью оператора foreach -> switch

$lang_result = [];

foreach ($result as $key=>$value ) {
    switch ($key){
        case 'name':
            array_push ($lang_result, [ $key => ['名字', $value] ]);
            break;

        case 'author':
            array_push ($lang_result, [ $key => ['作者', $value] ]);
            break;
    }

}

Но по мере того, как переведенный массив становится длиннее, оператор switch будет просто смешным. Как лучше это упростить?

3 ответа

Решение

As Dan mentioned array_merge_recursive может быть то, что вы хотите. In case you have other logic you need to implement here it is unrolled:

$result = ['name'=>'john', 'author'=>'smith', 'year'=>2011];
$lang = ['name'=>'名字', 'author'=>'作者', 'year'=>'年份'];

$lang_result = [];
foreach ($result as $key=>$value) {
    if (array_key_exists($key, $lang)) {
        $lang_result[$key] = [$lang[$key], $value];
    }
}

// these are the same (for now)
print_r($lang_result);
print_r(array_merge_recursive($lang, $result));

Попробуйте использовать array_merge_recursive

$newArray = array_merge_recursive($result, $lang);

Вам нужно сохранить нужные ключи в массиве, а затем сделать это так.

$lang_result = array();
$result = ['name'=>'john', 'author'=>'smith', 'year'=>2011 ];
$lang = ['name'=>'名字', 'author'=>'作者', 'year'=>'年份'];
$keys = array('name','author','year');
foreach($keys AS $key){
   if(isset($result[$key]) && isset($lang[$key])){
        $lang_result[$key] = array($result[$key],$lang[$key]);
   }
}
Другие вопросы по тегам