我有一个形式key =>值的关联数组,其中key是一个数值,但它不是一个连续的数值。键实际上是一个ID号,值是一个计数。这对于大多数实例来说都很好,但是我想要一个函数获得人类可读的数组名称并将其用作键,而不更改值。
我没有看到这样做的函数,但我假设我需要提供旧键和新键(我都有)并转换数组。有没有一种有效的方法来做到这一点?
我有一个形式key =>值的关联数组,其中key是一个数值,但它不是一个连续的数值。键实际上是一个ID号,值是一个计数。这对于大多数实例来说都很好,但是我想要一个函数获得人类可读的数组名称并将其用作键,而不更改值。
我没有看到这样做的函数,但我假设我需要提供旧键和新键(我都有)并转换数组。有没有一种有效的方法来做到这一点?
当前回答
你可以基于array_walk使用这个函数:
function mapToIDs($array, $id_field_name = 'id')
{
$result = [];
array_walk($array,
function(&$value, $key) use (&$result, $id_field_name)
{
$result[$value[$id_field_name]] = $value;
}
);
return $result;
}
$arr = [0 => ['id' => 'one', 'fruit' => 'apple'], 1 => ['id' => 'two', 'fruit' => 'banana']];
print_r($arr);
print_r(mapToIDs($arr));
它给:
Array(
[0] => Array(
[id] => one
[fruit] => apple
)
[1] => Array(
[id] => two
[fruit] => banana
)
)
Array(
[one] => Array(
[id] => one
[fruit] => apple
)
[two] => Array(
[id] => two
[fruit] => banana
)
)
其他回答
这里有一个帮助函数来实现这一点:
/**
* 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[“窗口小部件”]];
$arr[$newkey] = $arr[$oldkey];
unset($arr[$oldkey]);
这是一个实验(测试)
初始数组(像0、1、2这样的键)
$some_array[] = '6110';//
$some_array[] = '6111';//
$some_array[] = '6210';//
我必须将键名更改为例如human_readable15, human_readable16, human_readable17
类似于已经发布的内容。在每个循环中,我设置必要的键名,并从初始数组中删除相应的键。
例如,我插入mysql $some_array得到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/>';
如果human_readable15、human_readable16、human_readable17需要其他东西。然后就能创造出这样的东西
$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
}
本页对所要求的内容进行了广泛的解释,因为问题主体中没有最小的、可验证的示例。有些答案只是试图解决“标题”,而不费心去理解问题的要求。
键实际上是一个ID号,值是一个计数。这是 大多数情况下都没问题,但是我想要一个函数 人类可读的数组名称,并使用该名称作为键,无需 更改值。
PHP键不能被更改,但可以被替换——这就是为什么这么多答案建议使用array_search()(一个相对较差的性能)和unset()。
最终,您希望创建一个新数组,其名称作为与原始计数相关的键。这是通过查找数组最有效地完成的,因为搜索键总是比搜索值更好。
代码:(演示)
$idCounts = [
3 => 15,
7 => 12,
8 => 10,
9 => 4
];
$idNames = [
1 => 'Steve',
2 => 'Georgia',
3 => 'Elon',
4 => 'Fiona',
5 => 'Tim',
6 => 'Petra',
7 => 'Quentin',
8 => 'Raymond',
9 => 'Barb'
];
$result = [];
foreach ($idCounts as $id => $count) {
if (isset($idNames[$id])) {
$result[$idNames[$id]] = $count;
}
}
var_export($result);
输出:
array (
'Elon' => 15,
'Quentin' => 12,
'Raymond' => 10,
'Barb' => 4,
)
这种技术保持原始的数组顺序(以防排序问题),不做任何不必要的迭代,而且由于isset()的存在,速度非常快。