我有一个形式为key => value
的关联数组,其中键是数字值,但它不是顺序数字值。实际上,键是一个ID号码,而值是一个计数。这在大多数情况下都很好,但是我想要一个函数,该函数获取数组的可读名称并将其用作键,而不更改值。
我没有看到可以完成此任务的函数,但我假设我需要提供旧键和新键(我都有),并转换数组。有没有一种有效的方法来实现这个?
我有一个形式为key => value
的关联数组,其中键是数字值,但它不是顺序数字值。实际上,键是一个ID号码,而值是一个计数。这在大多数情况下都很好,但是我想要一个函数,该函数获取数组的可读名称并将其用作键,而不更改值。
我没有看到可以完成此任务的函数,但我假设我需要提供旧键和新键(我都有),并转换数组。有没有一种有效的方法来实现这个?
$tab = ['two' => [] ];
$tab['newname'] = & $tab['two'];
foreach($tab as $key=> & $value) {
if($key=='two') {
$newtab["newname"] = & $tab[$key];
} else {
$newtab[$key] = & $tab[$key];
}
}
使用键进行迭代比克隆整个数组更好,并且如果您有长达100行等的长数据,则清除旧数组。
一个保持顺序易于理解的简单方法:
function rename_array_key(array $array, $old_key, $new_key) {
if (!array_key_exists($old_key, $array)) {
return $array;
}
$new_array = [];
foreach ($array as $key => $value) {
$new_key = $old_key === $key
? $new_key
: $key;
$new_array[$new_key] = $value;
}
return $new_array;
}
这是一个实验(测试)
初始数组(键如0、1、2)
$some_array[] = '6110';//
$some_array[] = '6111';//
$some_array[] = '6210';//
我必须更改键名,例如human_readable15
,human_readable16
,human_readable17
类似于已发布的内容。在每个循环中,我设置必要的键名并从初始数组中删除相应的键。
例如,我将$some_array
插入mysql,得到lastInsertId
,我需要将键值对发送回jquery。
$first_id_of_inserted = 7;//lastInsertId
$last_loop_for_some_array = count($some_array);
for ($current_loop = 0; $current_loop < $last_loop_for_some_array ; $current_loop++) {
$some_array['human_readable'.($first_id_of_inserted + $current_loop)] = $some_array[$current_loop];//add new key for intial array
unset( $some_array[$current_loop] );//remove already renamed key from array
}
这里是新数组,带有重命名的键
echo '<pre>', print_r($some_array, true), '</pre>$some_array in '. basename(__FILE__, '.php'). '.php <br/>';
$arr_with_key_names[] = 'human_readable';
$arr_with_key_names[] = 'something_another';
$arr_with_key_names[] = 'and_something_else';
for ($current_loop = 0; $current_loop < $last_loop_for_some_array ; $current_loop++) {
$some_array[$arr_with_key_names[$current_loop]] = $some_array[$current_loop];//add new key for intial array
unset( $some_array[$current_loop] );//remove already renamed key from array
}
array_combine()
函数合并两个数组,而是要使用查找重新对一个数组进行键名重组。 - mickmackusa您可以编写一个简单的函数,将回调应用于给定数组的键。类似于array_map。
<?php
function array_map_keys(callable $callback, array $array) {
return array_merge([], ...array_map(
function ($key, $value) use ($callback) { return [$callback($key) => $value]; },
array_keys($array),
$array
));
}
$array = ['a' => 1, 'b' => 'test', 'c' => ['x' => 1, 'y' => 2]];
$newArray = array_map_keys(function($key) { return 'new' . ucfirst($key); }, $array);
echo json_encode($array); // {"a":1,"b":"test","c":{"x":1,"y":2}}
echo json_encode($newArray); // {"newA":1,"newB":"test","newC":{"x":1,"y":2}}
这里有一个要点 https://gist.github.com/vardius/650367e15abfb58bcd72ca47eff096ca#file-array_map_keys-php。
嗯,我之前没有测试过,但我认为这段代码可以工作。
function replace_array_key($data) {
$mapping = [
'old_key_1' => 'new_key_1',
'old_key_2' => 'new_key_2',
];
$data = json_encode($data);
foreach ($mapping as $needed => $replace) {
$data = str_replace('"'.$needed.'":', '"'.$replace.'":', $data);
}
return json_decode($data, true);
}