【问题标题】:Refactor (transpose) array to unique keys [duplicate]将数组重构(转置)为唯一键
【发布时间】:2013-11-10 22:00:57
【问题描述】:

我正在转置一些数据库结果以生成统计信息。

原始数组:

Array
(
    [0] => Array
        (
            [a] => apple
            [b] => beer
            [c] => chocolate
        )
    [1] => Array
        (
            [a] => aardvark
            [b] => bear
            [c] => chupacabra
        )
)

想要的结果:

Array
(
    [a] => Array
        (
            [0] => apple
            [1] => aardvark
        )
    [b] => Array
        (
            [0] => beer
            [1] => bear
        )

    [c] => Array
        (
            [0] => chocolate
            [1] => chupacabra
        )
)

示例代码:

$stats[] = array(
    'a' => 'apple',
    'b' => 'beer',
    'c' => 'chocolate'
);

$stats[] = array(
    'a' => 'aardvark',
    'b' => 'bear',
    'c' => 'chupacabra'
);

foreach (array_keys($stats[0]) as $key){
    $data[$key] = array_column($stats, $key);
}

上述代码使用array_keysarray_column (php 5.5) 运行良好。

  • 有没有更优雅的方式或者php函数可以达到同样的效果?

  • 这种重构的通用名称是什么?

编辑:

根据下面的 cmets,正确的术语是“转置”

【问题讨论】:

  • 这在数学上叫做“转置矩阵”。
  • @sectus 这是一个很好的解决方案,但不适用于此示例,因为它不保留字符串键
  • @Blazemonger 感谢您提供术语指针,作为答案发布?
  • Refactor 有不同的含义。
  • 现在我明白了,希望发现这个问题的人(比如我自己)使用了那个不正确的术语,他们会从你的回答中得到启发。

标签: php arrays refactoring


【解决方案1】:

我原以为有一个 array_* 函数来处理这类事情,但我不记得了,所以我去了 PHP 文档,结果发现 array_merge_recursive 正是你想要的。

array_merge_recursive($array1, $array2)

你有你的数组要组合成一个数组,所以你必须用数组的内容填充函数的参数。

call_user_func_array("array_merge_recursive", $stats)

这一行应该可以满足您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    相关资源
    最近更新 更多