【问题标题】:Flatten multidimensional array concatenating keys [duplicate]展平多维数组连接键[重复]
【发布时间】:2012-03-21 17:12:11
【问题描述】:

可能重复:
PHP convert nested array to single array while concatenating keys?
Get array's key recursively and create underscore seperated string

请在回答之前阅读整个问题。

我有这个多维数组:

$data = array(
    'user' => array(
        'email'   => 'user@example.com',
        'name'    => 'Super User',
        'address' => array(
            'billing' => 'Street 1',
            'delivery' => 'Street 2'
        )
    ),
    'post' => 'Hello, World!'
);

我想让它变平,变成:

$data = array(
    'user.email' => 'user@example.com',
    'user.name'  => 'Super User',
    'user.address.billing'  => 'Street 1',
    'user.address.delivery' => 'Street 2',
    'post'       => 'Hello, World!'
);

重要

  • 这些键对我来说非常很重要。我希望它们连接起来,用句点分隔。

  • 它应该适用于任何级别的嵌套。

谢谢!

【问题讨论】:

  • 有几个类似的问题,但我没有找到重复的。
  • 确实有两个副本。问的时候不知道无论如何,对它们的所有答案(除了 meagar 的答案)都远不如现在在这里给出的答案……它们不必要地复杂(使用迭代器、全局变量、类等,当它可以像我们在这里看到的一样简单时) )。

标签: php arrays multidimensional-array flatten


【解决方案1】:

这样的事情应该可以工作:

function flatten($array, $prefix = '') {
    $result = array();
    foreach($array as $key=>$value) {
        if(is_array($value)) {
            $result = $result + flatten($value, $prefix . $key . '.');
        }
        else {
            $result[$prefix . $key] = $value;
        }
    }
    return $result;
}

DEMO

【讨论】:

  • 谢谢!你也有对口吗?从这个扁平数组创建一个多数组?
  • 你先生,谢谢你,可惜这是订单中的最后一个答案,几乎没有注意到它
【解决方案2】:

感谢所有给出的答案。

我把它改成了下面的,这是一个改进的版本。它消除了对根前缀的需要,不需要使用引用,阅读起来更干净,而且名字更好:

function array_flat($array, $prefix = '')
{
    $result = array();

    foreach ($array as $key => $value)
    {
        $new_key = $prefix . (empty($prefix) ? '' : '.') . $key;

        if (is_array($value))
        {
            $result = array_merge($result, array_flat($value, $new_key));
        }
        else
        {
            $result[$new_key] = $value;
        }
    }

    return $result;
}

【讨论】:

    【解决方案3】:

    试试这个

    <?php
    
    $data = array(
        'user' => array(
            'email'   => 'user@example.com',
            'name'    => 'Super User',
            'address' => array(
                'billing' => 'Street 1',
                'delivery' => 'Street 2'
            )
        ),
        'post' => 'Hello, World!'
    );
    
    function prefixKey($prefix, $array)
    {
        $result = array();
        foreach ($array as $key => $value)
        {
            if (is_array($value))
                $result = array_merge($result, prefixKey($prefix . $key . '.', $value));
            else
                $result[$prefix . $key] = $value;
        }   
        return $result;
    }
    
    var_dump(prefixKey('', $data));
    
    ?>
    

    输出

    array
      'user.email' => string 'user@example.com' (length=16)
      'user.name' => string 'Super User' (length=10)
      'user.address.billing' => string 'Street 1' (length=8)
      'user.address.delivery' => string 'Street 2' (length=8)
      'post' => string 'Hello, World!' (length=13)
    

    【讨论】:

    • 真的很酷,很有帮助。谢谢!我会建议进行编辑(我删除了设置根前缀的需要)。
    • 嗯,我不能,我将作为单独的答案发布。
    • +1 - 引导我走向正确的道路。如果不需要根前缀,我会接受它。
    • 稍微改变了它,所以它不会做一个初始前缀。
    • 啊没关系。它与 Felix Kling 的解决方案几乎相同。
    【解决方案4】:

    测试一下here

    我通过引用传递,所以不需要返回。只需交出数组存储即可。

    $store = array();
    
    function flatten($array,&$storage,$parentKey = ''){
        foreach($array as $key => $value){
        $itemKey = (($parentKey)? $parentKey.'.':'').$key;
            if(is_array($value)){
                flatten($value,$storage,$itemKey);
            } else {
                $storage[$itemKey] = $value;
            }
        }   
    }
    
    flatten($data,$store);
    var_dump($store);
    

    【讨论】:

      【解决方案5】:

      使用这样的递归:

      function process_data( $data, $parent_key ){
      
          if ( ! is_array( $data ) ){
              return $data;
          }
      
          $flattened_array = array();
          foreach( $data as $key => $item ){
              $flattened_key = $parent_key . '.' . $key;
              $flattened_array[ $flattened_key ] = process_data( $item, $flattened_key );
          }
      
          return $flattened_array;
      
      }
      

      【讨论】:

      • 酷。 +1 但我不想指定根密钥。
      • $flattened_key = ( empty( $parent_key ) ) ? $key : $parent_key . '.' . $key;
      猜你喜欢
      • 1970-01-01
      • 2019-07-30
      • 2013-09-12
      • 2014-08-16
      • 2016-01-11
      • 2012-08-27
      • 1970-01-01
      • 2011-07-26
      相关资源
      最近更新 更多