CodeIgniter中如何在foreach循环调用多语言国家列表数组
现有逻辑存在的问题
- 硬依赖数据库查询:每次渲染下拉都要查询国家表,既增加了数据库开销,也无法天然支持多语言切换,数据库存储的国家名是固定语种的,切换语言后还要额外做翻译适配,逻辑冗余。
- 已配置的语言包没有被复用:你已经在各语言包中提前定义了对应语种的国家列表数组,现有逻辑完全没有用到这部分配置,做了重复工作。
- 不了解CodeIgniter Lang类的特性:CodeIgniter 3/4的
$this->lang->line()方法默认只支持返回字符串类型的语言项,直接用这个方法获取数组类型的lang_country_list只会返回false,这是你无法直接拿到国家数组遍历的核心原因。
正确实现方式
步骤1:正确获取语言包中的国家数组
CodeIgniter的Lang类会把所有加载的语言项存到language属性中,你可以直接从该属性读取数组类型的语言项,推荐在控制器中处理后传递到视图,符合MVC规范:
// 先加载你的语言包,如果你已经全局加载过可以省略这步 $this->lang->load('你的语言包文件名', 当前激活的语种标识); // 直接从language属性读取国家数组 $data['country_list'] = $this->lang->language['lang_country_list'] ?? []; // 传参到视图 $this->load->view('你当前的视图文件名', $data);
步骤2:修改视图下拉渲染逻辑
如果需要保留原逻辑的data-id国家ID属性,建议先把语言包的国家数组调整为键为国家ID、值为国家名称的格式,保证不同语种的语言包中数组的键(国家ID)完全一致即可,修改后的视图代码如下:
<div class="col-md-4"> <div class="form-group"> <label><?php echo $this->lang->line('lang_country'); ?><span class="text-danger">*</span></label> <select class="form-control" name="Country" > <option value=""><?php echo $this->lang->line('lang_select'); ?></option> <?php if(!empty($country_list)){ foreach($country_list as $country_id => $country_name){ ?> <option value="<?php echo $country_name; ?>" data-id="<?php echo $country_id; ?>"> <?php echo $country_name; ?></option> <?php } } ?> </select> </div> </div>
可选:调整后的语言包示例
english_lang.php:
$lang["lang_country_list"] = [ 1 => 'Afghanistan', 2 => 'Albania', 3 => 'Algeria', // 其余国家省略 ];
french_lang.php:
$lang["lang_country_list"] = [ 1 => 'Afghanistan', 2 => 'Albanie', 3 => 'Algérie', // 其余国家省略 ];
内容的提问来源于stack exchange,提问作者Jelly
相关产品推荐
相关产品推荐

