【问题标题】:PHP Change Array KeysPHP更改数组键
【发布时间】:2008-11-21 13:09:53
【问题描述】:

有没有办法在不循环数组的情况下将所有数字键更改为“名称”(所以是一个 php 函数)?

[
    0 => 'blabla',
    1 => 'blabla',
    2 => 'blblll',
    // etc ...
]

【问题讨论】:

  • 我读对了吗?看起来您希望数组中的所有元素都具有相同的键。
  • 我愿意,这是为了将数组转换为 XML。
  • 数组键必须是唯一的,您是如何尝试将其转换为 XML 的,您可以发布代码示例吗?
  • 使用不允许数字 startElements 的 XML 编写器。
  • 使用array_values复制数组值,将新名称按顺序放入数组中,使用array_combine制作新数组

标签: php


【解决方案1】:

如果您有要使用的键数组,请使用array_combine

给定 $keys = array('a', 'b', 'c', ...) 和你的数组 $list,然后这样做:

$list = array_combine($keys, array_values($list));

列表现在将是 array('a' => 'blabla 1', ...) 等。

您必须使用array_values 仅从数组中提取值,而不是旧的数字键。

这看起来不错且简单,但 array_values 会生成数组的完整副本,因此您可能会遇到空间问题。我们在这里所做的只是让 php 为我们执行循环,而不是消除循环。我很想做一些类似的事情:

foreach ($list as $k => $v) {
   unset ($list[$k]);

   $new_key =  *some logic here*

   $list[$new_key] = $v;
}

我不认为它比第一个代码更有效,但它提供了更多控制并且不会有数组长度的问题。

【讨论】:

    【解决方案2】:

    不,没有,对于初学者来说,不可能有一个元素共享相同键的数组

    $x =array(); 
    $x['foo'] = 'bar' ; 
    $x['foo'] = 'baz' ; #replaces 'bar'
    

    其次,如果您只想给数字加上前缀,那么

    $x[0] --> $x['foo_0']  
    

    如果没有循环,这在计算上是不可信的。目前不存在用于“键前缀”任务的 php 函数,最接近的是"extract",它将在数字键变为变量之前为其添加前缀。

    最简单的方法是这样的:

    function rekey( $input , $prefix ) { 
        $out = array(); 
        foreach( $input as $i => $v ) { 
            if ( is_numeric( $i ) ) { 
                $out[$prefix . $i] = $v; 
                continue; 
            }
            $out[$i] = $v;
        }
        return $out;
    }
    

    此外,在阅读 XMLWriter 用法后,我相信您会以一种糟糕的方式编写 XML。

    <section> 
        <foo_0></foo_0>
       <foo_1></foo_1>
       <bar></bar>
       <foo_2></foo_2>
    </section>
    

    不是好的 XML。

    <section> 
       <foo></foo>
       <foo></foo>
       <bar></bar>
       <foo></foo>
    </section>
    

    是更好的 XML,因为在解释时,重复的名称无关紧要,因为它们都像这样在数字上偏移:

    section => { 
        0 => [ foo , {} ]
        1 => [ foo , {} ]
        2 => [ bar , {} ]
        3 => [ foo , {} ] 
    }
    

    【讨论】:

    • 谢谢!当然,我不敢相信我错过了替换部分。
    【解决方案3】:

    这是一个为所有键添加下划线前缀的示例。

    我们使用array_combine 将数组键与数组值组合在一起,但我们首先在数组键上运行array_map 函数,该函数采用添加前缀的简单函数。

    $prefix = '_';
    $arr = array_combine(
        array_map(function($v) use ($prefix){
           return $prefix.$v;
        }, array_keys($arr)),
        array_values($arr)
    );
    

    在此处查看实时示例https://3v4l.org/HABl7

    【讨论】:

    • 纯代码答案没有多大用处。介意添加一些解释吗?
    【解决方案4】:

    我添加这个是为了回答另一个问题,并且看起来很相关。希望可以帮助需要更改数组中键值的人。使用 php 的内置函数。

    $inputArray = array('app_test' => 'test', 'app_two' => 'two');
    
    /**
     * Used to remap keys of an array by removing the prefix passed in
     * 
     * Example:
     * $inputArray = array('app_test' => 'test', 'app_two' => 'two');
     * $keys = array_keys($inputArray);
     * array_walk($keys, 'removePrefix', 'app_');
     * $remappedArray = array_combine($keys, $inputArray);
     *
     * @param $value - key value to replace, should be from array_keys
     * @param $omit - unused, needed for prefix call
     * @param $prefix - prefix to string replace in keys
     */
    function removePrefix(&$value, $omit, $prefix) {
        $value = str_replace($prefix, '', $value);
    }
    
    // first get all the keys to remap
    $keys = array_keys($inputArray);
    
    // perform internal iteration with prefix passed into walk function for dynamic replace of key
    array_walk($keys, 'removePrefix', 'app_');
    
    // combine the rewritten keys and overwrite the originals
    $remappedArray = array_combine($keys, $inputArray);
    
    // see full output of comparison
    var_dump($inputArray);
    var_dump($remappedArray);
    

    输出:

    array(2) {
      'attr_test' =>
      string(4) "test"
      'attr_two' =>
      string(3) "two"
    }
    array(2) {
      'test' =>
      string(4) "test"
      'two' =>
      string(3) "two"
    }
    

    【讨论】:

      【解决方案5】:

      我认为他想要:

      $a = array(1=>'first_name', 2=>'last_name');
      $a = array_flip($a);
      
      $a['first_name'] = 3;
      $a = array_flip($a);
      
      print_r($a);
      

      【讨论】:

      • 这会做出各种假设,例如 $a 数组值都是字符串并且都是唯一的。
      【解决方案6】:

      当您使用 XMLWriter(原生于 PHP 5.2.x$xml->startElement('itemName');,这将替换数组键。

      【讨论】:

        【解决方案7】:

        将数组键名“group”更改为“children”。

        <?php
        echo json_encode($data);
        
        function array_change_key_name( $orig, $new, &$array ) {
            foreach ( $array as $k => $v ) {
                $res[ $k === $orig ? $new : $k ] = ( (is_array($v)||is_object($v)) ? array_change_key_name( $orig, $new, $v ) : $v );
            }
            return $res;
        }
        
        echo '<br>=====change "group" to "children"=====<br>';
        $new = array_change_key_name("group" ,"children" , $data);
        echo json_encode($new);
        ?>
        

        结果:

        {"benchmark":[{"idText":"USGCB-Windows-7","title":"USGCB: Guidance for Securing Microsoft Windows 7 Systems for IT Professional","profile":[{"idText":"united_states_government_configuration_baseline_version_1.2.0.0","title":"United States Government Configuration Baseline 1.2.0.0","group":[{"idText":"security_components_overview","title":"Windows 7 Security Components Overview","group":[{"idText":"new_features","title":"New Features in Windows 7"}]},{"idText":"usgcb_security_settings","title":"USGCB Security Settings","group":[{"idText":"account_policies_group","title":"Account Policies group"}]}]}]}]}
        
        =====change "group" to "children"=====
        
        {"benchmark":[{"idText":"USGCB-Windows-7","title":"USGCB: Guidance for Securing Microsoft Windows 7 Systems for IT Professional","profile":[{"idText":"united_states_government_configuration_baseline_version_1.2.0.0","title":"United States Government Configuration Baseline 1.2.0.0","children":[{"idText":"security_components_overview","title":"Windows 7 Security Components Overview","children":[{"idText":"new_features","title":"New Features in Windows 7"}]},{"idText":"usgcb_security_settings","title":"USGCB Security Settings","children":[{"idText":"account_policies_group","title":"Account Policies group"}]}]}]}]}
        

        【讨论】:

          【解决方案8】:

          在php中使用数组array_flip

          $array = array ( [1] => Sell [2] => Buy [3] => Rent [4] => Jobs )
          print_r(array_flip($array));
          Array ( [Sell] => 1 [Buy] => 2 [Rent] => 3 [Jobs] => 4 ) 
          

          【讨论】:

            【解决方案9】:

            我为一组对象执行此操作。它基本上是在同一个数组中创建新键并取消设置旧键。

            public function transform($key, $results)
            {
                foreach($results as $k=>$result)
                {
                    if( property_exists($result, $key) )
                    { 
                        $results[$result->$key] = $result;
                        unset($results[$k]);
                    }
                }
            
                return $results;
            }
            

            【讨论】:

              【解决方案10】:
              <?php
                  $array[$new_key] = $array[$old_key];
                  unset($array[$old_key]);
              ?>
              

              【讨论】:

                【解决方案11】:

                要拥有相同的键,我认为它们必须位于单独的嵌套数组中。

                for ($i = 0; $i < count($array); $i++) {
                    $newArray[] = ['name' => $array[$i]];
                };
                

                输出:

                0 => array:1 ["name" => "blabla"]
                1 => array:1 ["name" => "blabla"]
                2 => array:1 ["name" => "blblll"]
                

                【讨论】:

                  【解决方案12】:

                  您可以创建一个包含该数组的新数组,因此:

                  <?php
                  $array = array();
                  $array['name'] = $oldArray;
                  ?>
                  

                  【讨论】:

                    猜你喜欢
                    • 2021-09-10
                    • 1970-01-01
                    • 2017-09-20
                    • 2013-12-31
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-06-14
                    • 2015-10-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多