首页 > 解决方案 > php 7.x 数组转换

问题描述

array:3 [
  0 => {
    +"zoomlevel": 1
    +"metric_cnt_1": 1
  }
  1 => {
    +"zoomlevel": 4
    +"metric_cnt_1": 1
  }
  2 => {
    +"zoomlevel": 6
    +"metric_cnt_1": 2
  }
]

上面的数组是 sql 查询的结果,例如:

select district_id as zoomlevel, count(*) as metric_cnt_1
from members
group by district;

我想将其“转换”为:

array:3 [
  1 => 1,
  4 => 1,
  6 => 2
]

php 是否有任何可用于此目的的数组函数?

标签: arraysphp-7

解决方案


请参阅@mark-baker 对此的回答。它比这个更好(除了底部的 PDO 位)。


我认为没有真正的技巧。您可以使用一个函数表达式来执行此操作array_reduce,也可以简单地使用foreach循环:

$input = [
    [
        'zoomlevel'=> 1,
        'metric_cnt_1'=> 1
    ], [
        'zoomlevel'=> 4,
        'metric_cnt_1'=> 1
    ], [
        'zoomlevel'=> 6,
        'metric_cnt_1'=> 2
    ]
];

$expected = [
    1 => 1,
    4 => 1,
    6 => 2
];

$result = array_reduce($input, function ($result, $record) {
    $key = $record['zoomlevel'];
    $value = $record['metric_cnt_1'];
    $result[$key] = $value;
    return $result;
}, []);

var_dump(assert($result == $expected));

$result2 = [];
foreach ($input as $record) {
    $key = $record['zoomlevel'];
    $value = $record['metric_cnt_1'];
    $result2[$key] = $value;
}

var_dump(assert($result2 == $expected));

我总是尽量避免使用通用foreach循环,但这只是个人喜好。通常使用有目的的数组高阶函数更清楚其意图是什么。如果可以避免的话,我也不喜欢手动构建数组。在这种情况下,我认为没有太多内容。


另一个可能更好的答案是首先以您需要的格式获取数据:

$connection = new \PDO("sqlsrv:Server=localhost;Database=scratch", "scratch", "scratch");

$result = $connection->query('
    select district_id as zoomlevel, count(*) as metric_cnt_1
    from members
    group by district_id
')->fetchAll(\PDO::FETCH_GROUP | \PDO::FETCH_COLUMN | \PDO::FETCH_UNIQUE);

$expected = [
    1 => 1,
    4 => 1,
    6 => 2
];

var_dump(assert($result == $expected));

推荐阅读