我有一个形式key =>值的关联数组,其中key是一个数值,但它不是一个连续的数值。键实际上是一个ID号,值是一个计数。这对于大多数实例来说都很好,但是我想要一个函数获得人类可读的数组名称并将其用作键,而不更改值。

我没有看到这样做的函数,但我假设我需要提供旧键和新键(我都有)并转换数组。有没有一种有效的方法来做到这一点?


当前回答

嗯,我没有测试之前,但我认为这段代码工作

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);
}

其他回答

您可以使用第二个关联数组将人类可读的名称映射到id。这也将提供多对1关系。然后这样做:

echo 'Widgets: '。美元$ data [humanreadbleMapping[“窗口小部件”]];

这是一个实验(测试)

初始数组(像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()的存在,速度非常快。

如果你还想让新数组键的位置与旧数组键的位置相同,你可以这样做:

function change_array_key( $array, $old_key, $new_key) {
    if(!is_array($array)){ print 'You must enter a array as a haystack!'; exit; }
    if(!array_key_exists($old_key, $array)){
        return $array;
    }

    $key_pos = array_search($old_key, array_keys($array));
    $arr_before = array_slice($array, 0, $key_pos);
    $arr_after = array_slice($array, $key_pos + 1);
    $arr_renamed = array($new_key => $array[$old_key]);

    return $arr_before + $arr_renamed + $arr_after;
}
$array = [
    'old1' => 1
    'old2' => 2
];

$renameMap = [
    'old1' => 'new1',   
    'old2' => 'new2'
];

$array = array_combine(array_map(function($el) use ($renameMap) {
    return $renameMap[$el];
}, array_keys($array)), array_values($array));

/*
$array = [
    'new1' => 1
    'new2' => 2
];
*/