我有两个关联数组,一个包含有关州(或省)的数据,另一个包含不同国家/地区。我从关系数据库中获取值,因此states数组不包含国家/地区名称,而是包含国家/地区ID。
States Array:
array(3) {
array {
'name' => 'Alabama',
'country' => 1},
array {
'name' => 'Alberta',
'country' => 2},
array {
'name' => 'Minnesota',
'country' => 1}
}
国家数组:
array(2) {
1 => 'United States',
2 => 'Canada'
}
我想要的结果是:
array(3) {
array {
'name' => 'Alabama',
'country' => 'United States'},
array {
'name' => 'Alberta',
'country' => 'Canada'},
array {
'name' => 'Minnesota',
'country' => 'United States'}
}
我进行了搜索和搜索,但没有找到解答此特定问题的问题。我敢肯定,我不是唯一拥有这样数据的人;也许我不是在寻找合适的条款。我确实在我的国家模型类中编写了一个函数来解决这个问题,但我认为必须有一个更有效的方法。
我目前的解决方案(它有效,但可能有更好的方法,对吗?):
function replaceKeyValues($replaceArray,$replaceKey)
{
$countries = $this->get_countries();
foreach ($replaceArray as &$itm) {
if (isset($itm[$replaceKey])) {
if (in_array($itm[$replaceKey], array_flip($countries))) {
$itm[$replaceKey] = $countries[$itm[$replaceKey]];
}
}
}
return $replaceArray;
}
//called like this (for example)
$states = $this->Country->replaceKeyValues($states,'country');
编辑:我最终使用了Jon的建议,并稍微修改了原始函数,使其足够通用,我不再需要在我的模型类中了。它现在在我的一个辅助类中,我添加了另一个输入参数,即“主数据”数组。希望这有助于某人:-)
function replaceKeyValues($masterArray,$replaceArray,$replaceKey)
{
foreach ($replaceArray as &$itm) {
if (isset($itm[$replaceKey])) {
if (isset($masterArray[$itm[$replaceKey]])) {
$itm[$replaceKey] = $masterArray[$itm[$replaceKey]];
}
}
}
return $replaceArray;
}
答案 0 :(得分:4)
除了这个
之外if (in_array($itm[$replaceKey], array_flip($countries)))
会更好地写成
if (isset($countries[$itm[$replaceKey]]))
以及嵌套条件可以被嵌套的事实,这是基本的,没有真正的改进机会。
您当然可以将foreach
替换为array_walk
和lambda,但这不会是“更好”。