在二维数组的每一行中重命名键。

40
在下面的数组中,我该如何将"fee_id"重命名为"id"?
输入数组:
[
    ['fee_id' => 15, 'fee_amount' => 308.5, 'year' => 2009],
    ['fee_id' => 14, 'fee_amount' => 308.5, 'year' => 2009],
]

预期结果:

[
    ['id' => 15, 'fee_amount' => 308.5, 'year' => 2009],
    ['id' => 14, 'fee_amount' => 308.5, 'year' => 2009],
]

10
这些数据来自数据库吗?你能否更改查询语句中的内容吗?例如:SELECT fee_id as id, fee_amount as amount, year FROM ..... - gnarf
是的,但是这个数组和生成它的查询在整个应用程序中都被使用,只需在一个地方更改输出会更容易。 - stef
可能是重复的问题:在PHP中,如何更改数组元素的键? - Oleg
11个回答

46
foreach ( $array as $k=>$v )
{
  $array[$k] ['id'] = $array[$k] ['fee_id'];
  unset($array[$k]['fee_id']);
}

这应该能够工作


2
你可能想要将它改为 foreach( array_keys($array) as $k) 或者 foreach($array as $k=>$v) - gnarf
7
这将改变顺序:新的键将位于末尾。 - Oleg
1
为什么不使用$v['fee_id']而是使用$array[$k]['fee_id'] - YFeizi
Yfeizi,因为那只会改变临时变量 $v,而我们想要改变原始数组。 - pbarney

19
你可以使用 array_map() 来实现。
$myarray = array_map(function($tag) {
    return array(
        'id' => $tag['fee_id'],
        'fee_amount' => $tag['fee_amount'],
        'year' => $tag['year']
    ); }, $myarray);

1
$arrayNum = count($theArray);

for( $i = 0 ; $i < $arrayNum ; $i++ )
{
    $fee_id_value = $theArray[$i]['fee_id'];
    unset($theArray[$i]['fee_id']);
    $theArray[$i]['id'] = $fee_id_value;
}

这应该可以工作。


因为它每次都重新计算了吗? - Niels Bom
是的,假设他有一个大数组,这将每次计算,导致页面加载变慢/服务器负载增加。 - lamas

0

我编写了一个使用对象或数组(单个或多维)的函数来执行此操作,请参见https://github.com/joaorito/php_RenameKeys

下面是一个简单的示例,您可以使用json功能与replace组合来执行它。

// Your original array (single or multi)

$original = array(
'DataHora'  => date('YmdHis'),
'Produto'   => 'Produto 1',
'Preco'     => 10.00,
'Quant'     => 2);

// Your map of key to change

$map = array(
'DataHora'  => 'Date',
'Produto'   => 'Product',
'Preco'     => 'Price',
'Quant'     => 'Amount');

$temp_array = json_encode($original);

foreach ($map AS $k=>$v) {
    $temp_array = str_ireplace('"'.$k.'":','"'.$v.'":', $temp);
    }

$new_array = json_decode($temp, $array);

0

这是可行的解决方案,我已经测试过了。

foreach ($myArray as &$arr) {
    $arr['id'] = $arr['fee_id'];
    unset($arr['fee_id']);
}

请注意,在for循环中使用引用变量可能是一个糟糕的想法。请参阅https://dev59.com/anA75IYBdhLWcg3wboUz。 - Pang

0

通过以下函数可以动态更改多维数组的键:

function change_key(array $arr, $keySetOrCallBack = []) 
{
    $newArr = [];

    foreach ($arr as $k => $v) {

        if (is_callable($keySetOrCallBack)) {
            $key = call_user_func_array($keySetOrCallBack, [$k, $v]);
        } else {
            $key = $keySetOrCallBack[$k] ?? $k;
        }

        $newArr[$key] = is_array($v) ? array_change_key($v, $keySetOrCallBack) : $v;
    }

    return $newArr;
}

示例例子:

$sampleArray = [
    'hello' => 'world', 
    'nested' => ['hello' => 'John']
];

//Change by difined key set
$outputArray = change_key($sampleArray, ['hello' => 'hi']);
//Output Array: ['hi' => 'world', 'nested' => ['hi' => 'John']];

//Change by callback  
$outputArray = change_key($sampleArray, function($key, $value) {
      return ucwords(key);
});
//Output Array: ['Hello' => 'world', 'Nested' => ['Hello' => 'John']];

0
下面的代码片段将重命名一个关联数组键,同时保留顺序(有时候...我们必须这样做)。如果您需要完全替换一个项目,可以用新键的$value来代替。
$old_key = "key_to_replace";
$new_key = "my_new_key";

$intermediate_array = array();
while (list($key, $value) = each($original_array)) {
  if ($key == $old_key) {
    $intermediate_array[$new_key] = $value;
  }
  else {
    $intermediate_array[$key] = $value;
  }
}
$original_array = $intermediate_array;

0

将当前的“fee_id”值复制到一个名为“id”的新键中,并取消设置先前的键?

foreach ($array as $arr)
{
  $arr['id'] = $arr['fee_id'];
  unset($arr['fee_id']);
}

据我所知,没有内置的函数可以执行这样的操作。


4
你需要将 $arr 设为引用,使用 foreach (...as &$arr)。否则对 $arr 的更改不会改变 $array。 - VolkerK
3
PHP手册指出:除非对数组进行引用,否则foreach将在指定数组的副本上运行而不是该数组本身。因此,这样做无法起作用。 - Niels Bom

0
创建了一个 rename_keys 函数,可选择递归支持:
function rename_keys(array &$array, array $key_map, bool $recursive = false): void
{
    if ($recursive) {
        foreach ($array as &$value) {
            if (is_array($value)) {
                rename_keys($value, $key_map, true);
            }
        }
        unset($value);
    }
    foreach ($key_map as $old_key => $new_key) {
        if (array_key_exists($old_key, $array)) {
            $array[$new_key] = $array[$old_key];
            unset($array[$old_key]);
        }
    }
}

用法:

rename_keys($arr, ["fee_id" => "id"], true);

为了澄清(因为这个答案没有解释它是如何工作的),$key_map 应该是一个扁平的数组。换句话说,如果你声明了一个多维键映射,并打算同步遍历原始数组和键数组之间的级别,那么它将无法满足。还应该指出,直接修改输入数组可能会意外地覆盖数据,如果一个新的键匹配一个旧的键。为了防止键冲突,将所有新键写入一个新数组。这个答案似乎回答了一个需要递归的不同问题。 - mickmackusa

0

将0转换为field0,1转换为field1,2转换为field2....

这只是一个例子,在其中我得到了以逗号分隔的字符串,并将其转换为多维数组,然后使用foreach循环更改了数组的键值。

<?php

    $str = "abc,def,ghi,jkl,mno,pqr,stu 
    abc,def,ghi,jkl,mno,pqr,stu
    abc,def,ghi,jkl,mno,pqr,stu
    abc,def,ghi,jkl,mno,pqr,stu;

    echo '<pre>';
    $arr1 = explode("\n", $str); // this will create multidimensional array from upper string
    //print_r($arr1);
    foreach ($arr1 as $key => $value) {
        $arr2[] = explode(",", $value);
        foreach ($arr2 as $key1 => $value1) {
            $i =0;
            foreach ($value1 as $key2 => $value2) { 
                $key3 = 'field'.$i;
                $i++;
                $value1[$key3] = $value2;
                unset($value1[$key2]);           
            }
        }
        $arr3[] = $value1;
    }
    print_r($arr3);


   ?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接