Преобразование массива 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 какие-либо функции массива, которые можно использовать для этой цели?

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
0
25
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

См. @ 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));

Спасибо, это работает. @ Адам, я изучаю ваше решение, чтобы понять, как оно работает.

Lakmal Premaratne 17.06.2018 05:28

@LakmalPremaratne тоже смотри мое обновление. Это может быть лучший подход, в зависимости от того, нужны ли вам исходные данные для чего-то еще.

Adam Cameron 17.06.2018 12:50

Функция PHP array_column () сделает это за вас:

$result = array_column($input, 'metric_cnt_1', 'zoomlevel');

О, я не знал об этом параметре index_key! Хороший. Лучше, чем мой ответ (кроме, возможно, PDO-ориентированного)

Adam Cameron 18.06.2018 13:44

Аргумент index_key действительно делает array_column() намного более мощным

Mark Baker 18.06.2018 14:13

Другие вопросы по теме