繁体   English   中英

将关联数组转换为索引数组的绝佳方法

[英]Elegant way to convert associative array into an indexed one

具有像这样的关联数组

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

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

所有这些都强烈地根据此答案改编(考虑投票!)。

帮手

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

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

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]);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM