arrays - 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 是否有任何可用于此目的的数组函数?
解决方案
请参阅@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));
推荐阅读
- text-files - 无法从窗口命令提示符将程序的输出保存在 txt 文件中
- excel - 不正确的参数(VBA 脚本)
- node.js - 使用 SQL Server、nodejs 和 bycrypt,请求在收到函数之前结束
- python - 如何将变量分配给函数?
- c++ - 用多部分键设置
- reactjs - React-Hooks-Form with Ionic-React select not returning selected value
- windows - MAX_PATH 是否足以保存 GetSystemDirectory() 的路径?
- excel - 基于重复日期的颜色行 - Excel VBA
- android - kivy song.stop() 有时不起作用,这取决于什么?
- testing - Mockito - 是否可以深度模拟 void 方法调用以不做任何事情?