Ответ 1
Получить в качестве ассоциированного
Для руководства: http://php.net/manual/en/pdostatement.fetchall.php
fetch_style
Управляет содержимым возвращенного массива, как описано в PDOStatement:: fetch(). Значение по умолчанию для PDO:: ATTR_DEFAULT_FETCH_MODE (которое по умолчанию относится к PDO:: FETCH_BOTH)
Чтобы вернуть массив, состоящий из всех значений одного столбца из набора результатов, укажите PDO:: FETCH_COLUMN. Вы можете указать, какой столбец вы хотите с параметром index-index.
Чтобы получить только уникальные значения одного столбца из набора результатов, побитовое ИЛИ PDO:: FETCH_COLUMN с PDO:: FETCH_UNIQUE.
Чтобы вернуть ассоциативный массив, сгруппированный по значениям указанного столбца, побитовое ИЛИ PDO:: FETCH_COLUMN с PDO:: FETCH_GROUP.
Этот последний бит является ключевым. Он, похоже, не полностью документирован (что я мог найти), но вместо PDO:: FETCH_COLUMN вы можете комбинировать PDO:: FETCH_ASSOC с PDO:: FETCH_GROUP для достижения желаемого результата:
$PDOstmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP)
Итак, учитывая приведенные выше данные:
$stmt = $PDO_obj->prepare('select * from brands');
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP);
d($result);
Результаты в:
array (6) [
'1' => array (1) [
array (2) [
'name' => string (10) "Solidfloor"
'url' => string (10) "solidfloor"
]
]
'2' => array (1) [
array (2) [
'name' => string (9) "Quickstep"
'url' => string (9) "quickstep"
]
]
'4' => array (1) [
array (2) [
'name' => string (10) "Cleanfloor"
'url' => string (10) "cleanfloor"
]
]
'5' => array (1) [
array (2) [
'name' => string (12) "Blue Dolphin"
'url' => string (12) "blue-dolphin"
]
]
'6' => array (1) [
array (2) [
'name' => string (5) "Krono"
'url' => string (5) "krono"
]
]
'8' => array (1) [
array (2) [
'name' => string (7) "Meister"
'url' => string (7) "meister"
]
]
]
(d() - это просто удобная функция отладки из библиотеки kint, например var_dump() или print_r())
Обратите внимание, что столбец, используемый для индексации массива, всегда будет первым столбцом в результатах, поэтому вы можете изменить свой оператор выбора, чтобы выбрать нужный столбец. Также обратите внимание, что индексированный столбец будет удален из каждого массива строк; чтобы обойти это, вы можете дважды добавить столбец в оператор select (т.е. select id, brands.* from brands
и т.д.).
Здесь указано больше параметров: http://php.net/manual/en/pdostatement.fetch.php, например PDO:: FETCH_UNIQUE, чтобы каждый индекс использовался только один раз.