Нет, это не возможно, чтобы получить массив в массиве в результате непосредственно из реляционных (SQL) базы данных.
Вам нужно будет перебрать результаты и создать массив самостоятельно, например.
$productsById = array();
foreach ($dbRows as $row) {
if (!isset($productsById[$row['product_id']])) {
$product = array(
'id' => $row['product_id'],
'name' => $row['product_name']
);
//note the use of the & to set the $product array by reference
$productsById[$row['product_id']] = &$product;
}
//note the use of the & to retrieve the $product array by reference
else $product = &$productsById[$row['product_id']];
$product['images'][] = array(
'id' => $row['image_id']
);
//We unset this because we accessed it by reference above; this prevents referencing the wrong product
//on the next iteration of the loop.
unset($product);
}
Или, чтобы получить массив объектов:
$productsById = array();
foreach ($dbRows as $row) {
if (!isset($productsById[$row['product_id']])) {
$product = new stdClass;
$product->id = $row['product_id'];
$product->name = $row['product_name'];
$product->images = array();
$productsById[$row['product_id']] = $product;
}
else $product = $productsById[$row['product_id']];
$image = new stdClass;
$image->id = $row['image_id'];
$product->images[] = $image;
}
Стоит также отметить, однако, что если вы используете MySQL (и портативность база данных не является проблемой), вы можете использовать функции GROUP_CONCAT, например:
SELECT p.id as product_id, p.name as product_name, GROUP_CONCAT(i.id) as image_ids
FROM product p
LEFT JOIN image i ON p.id = i.product_id
GROUP BY p.id
Затем в PHP, нужно иметь только один $ массив строк для каждого продукта, и вы могли бы получить идентификаторы изображений просто с помощью:
$imageIds = explode(',', $row['image_ids']);
Да. используйте sql join: http://en.wikipedia.org/wiki/Join_%28SQL%29 –
Я знаю, что sql join, но он не дает массив результатов в массиве. Он дает просто простой массив с отношением –
, это не БД неисправность. это ваша ошибка в том, что вы неправильно структурируете свой код «выборки». –