我想没有什么真正的窍门。你可以用一个函数表达式
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));
我总是尽量避免使用通用的
前额
在可能的情况下循环,但这只是个人偏好。通常使用有目的的数组高阶函数可以更清楚地知道意图是什么。如果可以避免的话,我也不喜欢手动创建数组。在这种情况下,我想里面没有什么。
另一个可能更好的解决方案是,首先以您需要的格式获取数据:
$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));