我有一个形式key =>值的关联数组,其中key是一个数值,但它不是一个连续的数值。键实际上是一个ID号,值是一个计数。这对于大多数实例来说都很好,但是我想要一个函数获得人类可读的数组名称并将其用作键,而不更改值。
我没有看到这样做的函数,但我假设我需要提供旧键和新键(我都有)并转换数组。有没有一种有效的方法来做到这一点?
我有一个形式key =>值的关联数组,其中key是一个数值,但它不是一个连续的数值。键实际上是一个ID号,值是一个计数。这对于大多数实例来说都很好,但是我想要一个函数获得人类可读的数组名称并将其用作键,而不更改值。
我没有看到这样做的函数,但我假设我需要提供旧键和新键(我都有)并转换数组。有没有一种有效的方法来做到这一点?
当前回答
这个函数将通过结合索引搜索来重命名数组键,并保持其位置。
function renameArrKey($arr, $oldKey, $newKey){
if(!isset($arr[$oldKey])) return $arr; // Failsafe
$keys = array_keys($arr);
$keys[array_search($oldKey, $keys)] = $newKey;
$newArr = array_combine($keys, $arr);
return $newArr;
}
用法:
$arr = renameArrKey($arr, 'old_key', 'new_key');
其他回答
KernelM的答案很好,但是为了避免Greg在评论中提出的问题(键冲突),使用一个新的数组会更安全
$newarr[$newkey] = $oldarr[$oldkey];
$oldarr=$newarr;
unset($newarr);
这段代码将帮助将旧密钥更改为新密钥
$i = 0;
$keys_array=array("0"=>"one","1"=>"two");
$keys = array_keys($keys_array);
for($i=0;$i<count($keys);$i++) {
$keys_array[$keys_array[$i]]=$keys_array[$i];
unset($keys_array[$i]);
}
print_r($keys_array);
显示如
$keys_array=array("one"=>"one","two"=>"two");
这适用于重命名第一个键:
$a = ['catine' => 'cat', 'canine' => 'dog'];
$tmpa['feline'] = $a['catine'];
unset($a['catine']);
$a = $tmpa + $a;
然后,print_r($a)呈现一个修复后的有序数组:
Array
(
[feline] => cat
[canine] => dog
)
这适用于重命名任意键:
$a = ['canine' => 'dog', 'catine' => 'cat', 'porcine' => 'pig']
$af = array_flip($a)
$af['cat'] = 'feline';
$a = array_flip($af)
print_r ($ a)
Array
(
[canine] => dog
[feline] => cat
[porcine] => pig
)
广义函数:
function renameKey($oldkey, $newkey, $array) {
$val = $array[$oldkey];
$tmp_A = array_flip($array);
$tmp_A[$val] = $newkey;
return array_flip($tmp_A);
}
这里有一个帮助函数来实现这一点:
/**
* Helper function to rename array keys.
*/
function _rename_arr_key($oldkey, $newkey, array &$arr) {
if (array_key_exists($oldkey, $arr)) {
$arr[$newkey] = $arr[$oldkey];
unset($arr[$oldkey]);
return TRUE;
} else {
return FALSE;
}
}
基于@KernelM的答案。
用法:
_rename_arr_key('oldkey', 'newkey', $my_array);
如果重命名成功,返回true,否则返回false。
您可以使用第二个关联数组将人类可读的名称映射到id。这也将提供多对1关系。然后这样做:
echo 'Widgets: '。美元$ data [humanreadbleMapping[“窗口小部件”]];