更改数组中键的名称

Posted

技术标签:

【中文标题】更改数组中键的名称【英文标题】:Changing key's name in a array 【发布时间】:2014-05-22 06:32:55 【问题描述】:

所以,有一个像下面这样的数组:

$input = [
    'first_name'   => 'Alex',
    'last_name'    => 'UFO',
    'email'        => 'test@test.com',
    'phone_number' => '124124',
    // .....
    'referral_first_name'   => 'Jason',
    'referral_last_name'    => 'McNugget',
    'referral_email'        => 'jingleball@nuggets.com',
    'referral_phone_number' => '1212415',
];

处理完第一部分,直到referral...,有没有更好的办法把referral_first_name替换成first_name等等,那么下面呢?也许是一种更加动态和自动的方式。

$input['first_name'] = $input['referral_first_name'];
unset($input['referral_first_name']);

$input['last_name'] = $input['referral_last_name'];
unset($input['referral_last_name']);

$input['email'] = $input['referral_email'];
unset($input['referral_email']);

$input['phone_number'] = $input['referral_phone_number'];
unset($input['referral_phone_number']);

伙计们,我忘了提,但我已经用foreach 完成了,但问题是当数组变得相当大时(通常会这样做,不是一个人使用该函数,而是很多人) ,这意味着额外的不必要的处理时间,因为它必须遍历整个数组,然后才能到达 referral_.. 部分。

【问题讨论】:

没有别的办法,只能在创建数组的时候这样做。 删除 referral_ 后,您的密钥被复制和覆盖。对此要小心。你可以看到我的答案和工作演示 【参考方案1】:

重新创建数组是唯一的方法..

从原始数组中获取所有键并将其放入临时数组中 使用array_walk 修改该临时数组以添加referral 字词 现在使用 array_combine 使用旧数组中的上述键和值。

代码..

<?php
$input = [
    'first_name'   => 'Alex',
    'last_name'    => 'UFO',
    'email'        => 'test@test.com',
    'phone_number' => '124124'];

$ak = array_keys($input);
array_walk($ak,function (&$v) $v = 'referral_'.$v;);
$input=array_combine($ak,array_values($input));
print_r($input);

OUTPUT:

Array
(
    [referral_first_name] => Alex
    [referral_last_name] => UFO
    [referral_email] => test@test.com
    [referral_phone_number] => 124124
)

既然要找性能,就用典型的foreach

$newarr = array();
foreach($input as $k=>$v ) 
$newarr["referral_".$k]=$v;

【讨论】:

这看起来真不错。我有一个涉及使用foreach 的解决方案,但我真的不想使用它,因为数组可能会变得非常大。是的,太好了! @w0rldart:如果数组非常大,那么您可能希望坚持使用foreacharray_walk 在处理大型数组时较慢。此外,与foreach 不同,您不能限制function(&amp;$v) ... 块内的操作,因为它会每次 执行一次。 @ShankarDamodaran 那么我可能根本不会使用任何这些解决方案,因为它们都涉及处理时间的一些增加,而是使用unset 版本。没想到array_walk 会更慢。感谢您的信息 @w0rldart,从您的问题编辑来看,array_walk 仍然使用内部循环结构。 @ShankarDamodaran 是的,看起来是这样。好吧,我现在会坚持使用unset,但感谢您的解决方案!【参考方案2】:

您可以使用以下;

function changeKeys($input) 
    $keys = array_keys($input);
    foreach($keys as $key) 
        if (strpos($key, "referral_") !== false) 
            $tempKey = explode("referral_", $key);
            $input[$tempKey[1]] = $input[$key];
                unset($input[$key]);
        
       
    return $input;


changeKeys($input);

这是一个工作演示:codepad

注意:请确保,在“referral_”删除后,您的密钥会因重复密钥而被覆盖

【讨论】:

【参考方案3】:

你必须创建另一个数组,这段代码应该动态地做:

$newInput = array();
foreach($input as $key => $element)
    $newKey = explode("_", $key, 2);
    $newInput[$newKey[1]] = $element;

输出

希望这会有所帮助:-)

【讨论】:

【参考方案4】:

试试下面的...

$input = [
   //'first_name'   => 'Alex',
   // 'last_name'    => 'UFO',
   // 'email'        => 'test@test.com',
    //'phone_number' => '124124',
    // .....
    'referral_first_name'   => 'Jason',
    'referral_last_name'    => 'McNugget',
    'referral_email'        => 'jingleball@nuggets.com',
    'referral_phone_number' => '1212415',
];

foreach ($input as $key=>$value)
    $refereal_pos = strpos($key, 'referral_');
    if($refereal_pos !== FALSE && $refereal_pos == 0)
        $input[str_replace('referral_', '', $key)] = $value;
        unset($input[$key]);
    


print_r($input);

【讨论】:

【参考方案5】:

这样的事情怎么样:

$replace = array('first_name', 'last_name', 'email');
foreach($replace AS $key) 
    $input[$key] = $input['referral_' . $key];
    unset($input[$input['referral_' .$key]]);

【讨论】:

以上是关于更改数组中键的名称的主要内容,如果未能解决你的问题,请参考以下文章

根据对象中键的名称过滤对象数组[重复]

如何获取 couchdb 中键的值

如何更改哈希映射中键的值? [复制]

如何在Python中更改嵌套字典中键的值[关闭]

在php中获取多维数组中键的值

如何将数组中键的值添加到字典中? [关闭]