【问题标题】:Elegant way to convert associative array into an indexed one [duplicate]将关联数组转换为索引数组的优雅方法[重复]
【发布时间】:2012-05-17 00:10:13
【问题描述】:

有一个类似的关联数组

$myarray = array (
  'user' => array (
      2 => 'john',
      5 => 'done',
      21 => 'foo'
  ),
  'city' => array (
      2 => 'london',
      5 => 'buenos aires',
      21 => 'paris',
  ),
  'age' => array (
      2 => 24,
      5 => 38,
      21 => 16
  )
  ...
);

已编辑
假设我不知道这个数组有多少键,也不知道键本身(它们可能是什么)以上只是一个示例

有什么优雅的方法(使用内置函数而不是循环)将其转换为

$result = array(
    array(
        'user',
        'city',
        'age'
        ...
    ),
    array(
        'john',
        'london',
        24
        ...
    ),
    array(
        'done',
        'buenos aires',
        38
        ...
    ),
    array(
        'foo',
        'paris',
        16
        ...
    )
);




作为一个附带问题:如何也获得它(以类似的优雅方式)

$result = array(
    array(
        'row',
        'user',
        'city',
        'age'
        ...
    ),
    array(
        2,
        'john',
        'london',
        24
        ...
    ),
    array(
        5,
        'done',
        'buenos aires',
        38
        ...
    ),
    array(
        21,
        'foo',
        'paris',
        16
        ...
    )
);

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    请注意,这两个操作基本上都是原始数组的转置。

    所有这些都强烈改编自this answer(考虑支持它!)。

    帮手

    首先我们需要一个辅助函数,它将行标题作为关联数组中的键:

    function flipArrayKeys($arr) {
        $out = array('row' => array_keys($arr));
        foreach ($arr as $key => $subarr) {
            foreach ($subarr as $subkey => $subvalue) {
                $out[$subkey][] = $subvalue;
            }
        }
        return $out;
    }
    

    flipArrayKeys($myarray) 给出:

    array (
      'row' => 
      array (
        0 => 'user',
        1 => 'city',
        2 => 'age',
      ),
      2 => 
      array (
        0 => 'john',
        1 => 'london',
        2 => 24,
      ),
      5 => 
      array (
        0 => 'done',
        1 => 'buenos aires',
        2 => 38,
      ),
      21 => 
      array (
        0 => 'foo',
        1 => 'paris',
        2 => 16,
      ),
    )
    

    第 1 部分

    $result = array_values(flipArrayKeys($myarray));
    

    现在结果如下:

    array (
      0 => 
      array (
        0 => 'user',
        1 => 'city',
        2 => 'age',
      ),
      1 => 
      array (
        0 => 'john',
        1 => 'london',
        2 => 24,
      ),
      2 => 
      array (
        0 => 'done',
        1 => 'buenos aires',
        2 => 38,
      ),
      3 => 
      array (
        0 => 'foo',
        1 => 'paris',
        2 => 16,
      ),
    )
    

    这部分也可以使用this answer中的transpose来完成:

    $result = transpose($myarray);
    array_unshift($result, array_keys($myarray));
    

    第 2 部分

    function flipArrayWithHeadings($arr) {
        $out = flipArrayKeys($arr);
    
        foreach (array_keys($out) as $key) {
            array_unshift($out[$key],$key);
        }
        return array_values($out);
    }
    

    所以flipArrayWithHeadings($myarray) 看起来像:

    array (
      0 => 
      array (
        0 => 'row',
        1 => 'user',
        2 => 'city',
        3 => 'age',
      ),
      1 => 
      array (
        0 => 2,
        1 => 'john',
        2 => 'london',
        3 => 24,
      ),
      2 => 
      array (
        0 => 5,
        1 => 'done',
        2 => 'buenos aires',
        3 => 38,
      ),
      3 => 
      array (
        0 => 21,
        1 => 'foo',
        2 => 'paris',
        3 => 16,
      ),
    )
    

    【讨论】:

    • 我需要一个不同混合的结果数组,请看更好:例如最后一个不会是array(24, 38, 16),而是array('foo', 'paris', 16 ) .. 它们完全重新映射
    • 对不起,我看错了问题;现在应该修好了! :)(不幸的是不是特别优雅。)
    【解决方案2】:

    array_values 函数用作:

    $result = array(array_values($myarray['user']), 
              array_values($myarray['city']), 
              array_values($myarray['age']));
    

    对于问题的第二部分,您可以:

    $result2 = array_keys($myarray);
    
    foreach(array_keys($myarray['user']) as $k) {
      $result2[] = array($k, $myarray['user'][$k], $myarray['city'][$k], $myarray['age'][$k]);
    }
    

    【讨论】:

    • 如果我事先不知道密钥怎么办?我编辑了我的问题,以便在这一点上更清楚......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    相关资源
    最近更新 更多