【问题标题】:How to rename sub-array keys in PHP?如何在 PHP 中重命名数组键?
【发布时间】:2012-03-25 04:43:57
【问题描述】:

当我对一个名为 $tags(一个多维数组)的变量进行 var_dump 时,我得到了这个:

数组
(
    [0] => 数组
        (
            [名称] => 制表符
            [url] => 制表符
        )

    [1] => 数组
        (
            [名称] => 虎斑里迪曼
            [url] => 虎斑里迪曼
        )

    [2] => 数组
        (
            [名称] => 表
            [url] => 表格
        )

    [3] => 数组
        (
            [名称] => 小报
            [url] => 小报
        )

    [4] => 数组
        (
            [名称] => 塔可钟
            [url] => 塔可钟
        )

    [5] => 数组
        (
            [名称] => 炸玉米饼
            [网址] => 炸玉米饼
        )
)

我想将所有名为“url”的数组键重命名为“value”。有什么好的方法可以做到这一点?

【问题讨论】:

标签: php


【解决方案1】:

循环,设置新密钥,取消设置旧密钥。

foreach($tags as &$val){
    $val['value'] = $val['url'];
    unset($val['url']);
}

【讨论】:

    【解决方案2】:

    你可以使用array_map()来做。

    $tags = array_map(function($tag) {
        return array(
            'name' => $tag['name'],
            'value' => $tag['url']
        );
    }, $tags);
    

    【讨论】:

    • 不错!快速说明:闭包(匿名函数)仅在 php 5.3.0+ 中可用
    • 快速提示:您需要使用 PHP 5.6 或更高版本,否则您运行的是不受支持的 php 版本,可能会出现安全问题。
    • 非常快速的说明:使用 PHP 7 时会保存树木
    • 您好,我有一个有几列的案例,有没有办法使用类似的功能,不会覆盖每个项目,而只是改变?还有这么多编码......
    【解决方案3】:
    foreach ($basearr as &$row)
    {
        $row['value'] = $row['url'];
        unset( $row['url'] );
    }
    
    unset($row);
    

    【讨论】:

    • 警告:即使在 foreach 循环之后,$row 的引用和最后一个数组元素仍然存在。建议通过 unset() 将其销毁。否则,您可能会遇到意外行为。见secure.php.net/manual/en/control-structures.foreach.phpstackoverflow.com/q/3307409stackoverflow.com/q/4969243
    • 至少不要在迭代后使用$row,并且foreach在函数内部执行,函数结束后会自动销毁。有时$row 会很有用,如果您中断了迭代并想使用foreach 之外的最后一个迭代元素。
    • 谢谢@griever,你节省了我的时间
    【解决方案4】:

    这应该适用于大多数 PHP 4+ 版本。 5.3以下不支持使用匿名函数的数组映射。

    当使用严格的 PHP 错误处理时,foreach 示例也会抛出警告。

    这是一个小的多维键重命名功能。它还可以用于处理数组以在整个应用程序中拥有正确的完整性密钥。当 key 不存在时,它不会抛出任何错误。

    function multi_rename_key(&$array, $old_keys, $new_keys)
    {
        if(!is_array($array)){
            ($array=="") ? $array=array() : false;
            return $array;
        }
        foreach($array as &$arr){
            if (is_array($old_keys))
            {
                foreach($new_keys as $k => $new_key)
                {
                    (isset($old_keys[$k])) ? true : $old_keys[$k]=NULL;
                    $arr[$new_key] = (isset($arr[$old_keys[$k]]) ? $arr[$old_keys[$k]] : null);
                    unset($arr[$old_keys[$k]]);
                }
            }else{
                $arr[$new_keys] = (isset($arr[$old_keys]) ? $arr[$old_keys] : null);
                unset($arr[$old_keys]);
            }
        }
        return $array;
    }
    

    用法很简单。您可以像在示例中那样更改单个键:

    multi_rename_key($tags, "url", "value");
    

    或更复杂的多键

    multi_rename_key($tags, array("url","name"), array("value","title"));
    

    它使用与 preg_replace() 类似的语法,其中 $old_keys 和 $new_keys 的数量应该相同。但是,当它们不是空白键时会添加。这意味着您可以使用它为数组添加排序 if 架构。

    一直用这个,希望对你有帮助!

    【讨论】:

    • 或者你可以使用 array_map($tags,create_function('$tag','return array( "name" => $tag["name"], "value" => $tag[ “网址”]'));
    • 当您系统地重命名时,这确实会变得混乱。 create_function 也使用了 eval,如果可能的话显然应该避免。
    • 为什么这么复杂?
    【解决方案5】:

    谈到函数式 PHP,我有这个更通用的答案:

        array_map(function($arr){
            $ret = $arr;
            $ret['value'] = $ret['url'];
            unset($ret['url']);
            return $ret;
        }, $tag);
    }
    

    【讨论】:

      【解决方案6】:

      递归php重命名键函数:

      function replaceKeys($oldKey, $newKey, array $input){
          $return = array(); 
          foreach ($input as $key => $value) {
              if ($key===$oldKey)
                  $key = $newKey;
      
              if (is_array($value))
                  $value = replaceKeys( $oldKey, $newKey, $value);
      
              $return[$key] = $value;
          }
          return $return; 
      }
      

      【讨论】:

      • 这是一个绝妙的解决方案!它重命名键在多维数组中的任何位置。谢谢你,这为我节省了几个小时的工作时间。
      【解决方案7】:
      class DataHelper{
      
          private static function __renameArrayKeysRecursive($map = [], &$array = [], $level = 0, &$storage = []) {
              foreach ($map as $old => $new) {
                  $old = preg_replace('/([\.]{1}+)$/', '', trim($old));
                  if ($new) {
                      if (!is_array($new)) {
                          $array[$new] = $array[$old];
                          $storage[$level][$old] = $new;
                          unset($array[$old]);
                      } else {
                          if (isset($array[$old])) {
                              static::__renameArrayKeysRecursive($new, $array[$old], $level + 1, $storage);
                          } else if (isset($array[$storage[$level][$old]])) {
                              static::__renameArrayKeysRecursive($new, $array[$storage[$level][$old]], $level + 1, $storage);
                          }
                      }
                  }
              }
          }
      
          /**
           * Renames array keys. (add "." at the end of key in mapping array if you want rename multidimentional array key).
           * @param type $map
           * @param type $array
          */
          public static function renameArrayKeys($map = [], &$array = [])
          {
              $storage = [];
              static::__renameArrayKeysRecursive($map, $array, 0, $storage);
              unset($storage);
          }
      }
      

      用途:

      DataHelper::renameArrayKeys([
          'a' => 'b',
          'abc.' => [
             'abcd' => 'dcba'
          ]
      ], $yourArray);
      

      【讨论】:

        【解决方案8】:

        来自重复的问题

        $json = '[   
        {"product_id":"63","product_batch":"BAtch1","product_quantity":"50","product_price":"200","discount":"0","net_price":"20000"},    
        {"product_id":"67","product_batch":"Batch2","product_quantity":"50","product_price":"200","discount":"0","net_price":"20000"}
        ]';
        
        $array = json_decode($json, true);
        
        $out = array_map(function ($product) {
          return array_merge([
            'price'    => $product['product_price'],
            'quantity' => $product['product_quantity'],
          ], array_flip(array_filter(array_flip($product), function ($value) {
            return $value != 'product_price' && $value != 'product_quantity';
          })));
        }, $array);
        
        var_dump($out);
        

        https://repl.it/@Piterden/Replace-keys-in-array

        【讨论】:

          【解决方案9】:

          替换多维数组中键的非常简单的方法,甚至可能有点危险,但如果您对源数组有某种控制,应该可以正常工作:

          $array = [ 'oldkey' => [ 'oldkey' => 'wow'] ];
          $new_array = json_decode(str_replace('"oldkey":', '"newkey":', json_encode($array)));
          print_r($new_array); // [ 'newkey' => [ 'newkey' => 'wow'] ]
          

          【讨论】:

            【解决方案10】:

            这就是我重命名键的方式,尤其是对于已上传到电子表格中的数据:

            function changeKeys($array, $new_keys) {
                $newArray = [];
            
                foreach($array as $row) {
                    $oldKeys = array_keys($row);
                    $indexedRow = [];
            
                    foreach($new_keys as $index => $newKey)
                        $indexedRow[$newKey] = isset($oldKeys[$index]) ? $row[$oldKeys[$index]] : '';
            
                    $newArray[] = $indexedRow;
                }
            
                return $newArray;
            }
            

            【讨论】:

              【解决方案11】:

              基于 Alex 提供的出色解决方案,我根据我正在处理的场景创建了一个更灵活的解决方案。因此,现在您可以对具有不同数量的嵌套键对的多个数组使用相同的函数,您只需传入一个键名数组即可用作替换。

              $data_arr = [
                0 => ['46894', 'SS'],
                1 => ['46855', 'AZ'],
              ];
              
              function renameKeys(&$data_arr, $columnNames) {
                // change key names to be easier to work with.
                $data_arr = array_map(function($tag) use( $columnNames) {
                  $tempArray = [];
                  $foreachindex = 0;
                  foreach ($tag as $key => $item) {
                    $tempArray[$columnNames[$foreachindex]] = $item;
                    $foreachindex++;
                  }
                  return $tempArray;
                }, $data_arr);
              
              }
              
              renameKeys($data_arr, ["STRATEGY_ID","DATA_SOURCE"]);
              

              【讨论】:

                【解决方案12】:

                这对我来说非常适合

                 $some_options = array();;
                if( !empty( $some_options ) ) {
                   foreach( $some_options as $theme_options_key => $theme_options_value ) {
                      if (strpos( $theme_options_key,'abc') !== false) { //first we check if the value contain 
                         $theme_options_new_key = str_replace( 'abc', 'xyz', $theme_options_key ); //if yes, we simply replace
                         unset( $some_options[$theme_options_key] );
                         $some_options[$theme_options_new_key] = $theme_options_value;
                      }
                   }
                }
                return  $some_options;
                

                【讨论】:

                  【解决方案13】:

                  这并不难。无论它们在多维数组中有多深,您都可以简单地分配数组:

                  $array['key_old'] = $array['key_new'];
                  unset($array['key_old']);
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2012-09-16
                    • 1970-01-01
                    • 2014-03-19
                    • 2012-11-20
                    • 2015-12-28
                    • 1970-01-01
                    • 2020-11-26
                    • 2018-05-17
                    相关资源
                    最近更新 更多