更改数组中键的名称
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:如果数组非常大,那么您可能希望坚持使用foreach
。 array_walk
在处理大型数组时较慢。此外,与foreach
不同,您不能限制function(&$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]]);
【讨论】:
以上是关于更改数组中键的名称的主要内容,如果未能解决你的问题,请参考以下文章