1

有一个关联数组

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

2 回答 2

3

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

所有这些都强烈改编自这个答案(考虑支持它!)。

帮手

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

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,
  ),
)

这部分也可以使用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,
  ),
)
于 2012-05-08T13:44:46.887 回答
3

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]);
}
于 2012-05-08T13:45:31.813 回答