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));
@LakmalPremaratne тоже смотри мое обновление. Это может быть лучший подход, в зависимости от того, нужны ли вам исходные данные для чего-то еще.
Функция PHP array_column () сделает это за вас:
$result = array_column($input, 'metric_cnt_1', 'zoomlevel');
О, я не знал об этом параметре index_key! Хороший. Лучше, чем мой ответ (кроме, возможно, PDO-ориентированного)
Аргумент index_key действительно делает array_column() намного более мощным
Спасибо, это работает. @ Адам, я изучаю ваше решение, чтобы понять, как оно работает.