将关联数组转换为索引数组的优雅方法

时间:2012-05-08 13:41:52

标签: php arrays

拥有像

这样的关联数组
$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
  )
  ...
);

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

是否有任何优雅的方式(使用内置函数而不是循环)将其转换为

$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
        ...
    )
);

2 个答案:

答案 0 :(得分:3)

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

所有这些都强调了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,
  ),
)

答案 1 :(得分:3)

array_values功能用作:

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

对于问题的第2部分,您可以这样做:

$result2 = array_keys($myarray);

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