【问题标题】: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_ 后,您的密钥被复制和覆盖。对此要小心。你可以看到我的答案和工作演示

标签: php arrays key unset


【解决方案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]]);
        }
        

        【讨论】:

          猜你喜欢
          • 2016-03-05
          • 1970-01-01
          • 2021-09-28
          • 1970-01-01
          • 2022-11-21
          • 2011-05-23
          • 1970-01-01
          • 2021-02-12
          • 2011-10-12
          相关资源
          最近更新 更多