PHP组查询结果作为嵌套关联数组
我试图以高效的方式将PHP中的查询结果分组为关联数组。 我可以使用多个嵌套的foreach循环,检查每个数组组的当前id字段是否与之前的匹配,但我猜有更好/更有效的解决方案来解决这个问题。 有人有聪明的解决办法吗?理想情况下,是一个通用函数或方法,可以在给定键字段或嵌套键字段数组的情况下对任何查询结果集进行分组 以下是查询结果数组:PHP组查询结果作为嵌套关联数组,php,mysql,multidimensional-array,Php,Mysql,Multidimensional Array,我试图以高效的方式将PHP中的查询结果分组为关联数组。 我可以使用多个嵌套的foreach循环,检查每个数组组的当前id字段是否与之前的匹配,但我猜有更好/更有效的解决方案来解决这个问题。 有人有聪明的解决办法吗?理想情况下,是一个通用函数或方法,可以在给定键字段或嵌套键字段数组的情况下对任何查询结果集进行分组 以下是查询结果数组: Array ( [0] => Array ( [look_id] => 3 [l
Array
(
[0] => Array
(
[look_id] => 3
[look_name] => Test Look
[look_description] => description here
[clothing_article_id] => 1
[clothing_article_name] => Coat
[look_clothing_article_attribute_id] => 1
[look_clothing_article_attribute_name] => Purple
[clothing_brand_name] => Gap
[clothing_article_brand_price] => 40.00
[clothing_article_brand_attribute_price] => 50.00
[clothing_article_brand_attribute_name] => Purple
)
[1] => Array
(
[look_id] => 3
[look_name] => Test Look
[look_description] => description here
[clothing_article_id] => 1
[clothing_article_name] => Coat
[look_clothing_article_attribute_id] => 2
[look_clothing_article_attribute_name] => Black
[clothing_brand_name] => Gap
[clothing_article_brand_price] => 40.00
[clothing_article_brand_attribute_price] =>
[clothing_article_brand_attribute_name] =>
)
[2] => Array
(
[look_id] => 3
[look_name] => Test Look
[look_description] => description here
[clothing_article_id] => 2
[clothing_article_name] => Pants
[look_clothing_article_attribute_id] => 3
[look_clothing_article_attribute_name] => Cuffed
[clothing_brand_name] =>
[clothing_article_brand_price] =>
[clothing_article_brand_attribute_price] =>
[clothing_article_brand_attribute_name] =>
)
)
这是我想将其转换为的数组:
Array
(
'looks' => Array(
[0] => Array(
'id' => 3,
'name' => 'Test Look',
'description' => 'description here',
'clothingArticles' => Array(
[0] => Array(
'id' => 1,
'name' => 'Coat',
'attributes' => Array(
[0] => Array(
'id' => 1,
'name' => 'Purple'
'brands' => Array(
[0] => Array(
'name' => 'Gap',
'price' => 50.00
)
)
),
[1] => Array(
'id' => 2,
'name' => 'Black'
)
),
'brands' => Array(
[0] => Array(
'name' => 'Gap',
'price' => 40.00
)
)
),
[1] => Array(
'id' => 2,
'name' => 'Pants',
'attributes' => Array(
[0] => Array(
'id' => 3,
'name' => 'Cuffed'
'brands' => Array()
)
),
'brands' => Array()
)
)
)
)
)
分组关系说明:
一个外观可以有1个或多个服装物品。
一件服装可以有一个或多个服装品牌。
look服装文章可以有一个或多个属性。
一个服装品牌可以有一个或多个属性。这样做应该不会太吓人;不要对内部数组使用数字索引,而应该使用唯一标识符,这样就可以对其进行分组。这并不妨碍您在数组本身中使用该标识符
//seems a little pointless?
$looks = array('looks' => array());
$looks = &$looks['looks'];
while ($row = $result->fetch()) {
if (!isset($looks[$row->look_id])) {
$looks[$row->look_id] = array(
'id' => $row->look_id,
'name' => $row->look_name,
'description' => $row->look_description,
'clothingArticles' => array()
);
}
$look = &$looks[$row->look_id];
if (!isset($look[$row->clothing_article_id])) {
//continue this process as needed
这样做不应该太吓人;不要对内部数组使用数字索引,而应该使用唯一标识符,这样就可以对其进行分组。这并不妨碍您在数组本身中使用该标识符
//seems a little pointless?
$looks = array('looks' => array());
$looks = &$looks['looks'];
while ($row = $result->fetch()) {
if (!isset($looks[$row->look_id])) {
$looks[$row->look_id] = array(
'id' => $row->look_id,
'name' => $row->look_name,
'description' => $row->look_description,
'clothingArticles' => array()
);
}
$look = &$looks[$row->look_id];
if (!isset($look[$row->clothing_article_id])) {
//continue this process as needed
执行尽可能多的连接级别查询,每个表一个查询,所有查询都在同一列上排序,并将行编织在一起:
$q1 = "SELECT * FROM look ORDER BY look_id";
$q2 = "SELECT look_id, article.* FROM look INNER JOIN article USING(look_id) ORDER BY look_id, article_id";
$q3 = "SELECT look_id, article_id, attribute.* FROM look INNER JOIN article USING(look_id) INNER JOIN attribute USING(article_id) ORDER BY look_id, article_id, attribute_id";
// loop on looks
// inner loop on article and add to look
// inner loop on attribute and add to article
或者您可以使用一个现成的库,如。执行尽可能多的查询,每个表一个查询,所有查询都在同一列上排序,并将行编织在一起:
$q1 = "SELECT * FROM look ORDER BY look_id";
$q2 = "SELECT look_id, article.* FROM look INNER JOIN article USING(look_id) ORDER BY look_id, article_id";
$q3 = "SELECT look_id, article_id, attribute.* FROM look INNER JOIN article USING(look_id) INNER JOIN attribute USING(article_id) ORDER BY look_id, article_id, attribute_id";
// loop on looks
// inner loop on article and add to look
// inner loop on attribute and add to article
或者您可以使用现成的库,如。好的,到目前为止您尝试了什么?什么不起作用?好吧,到目前为止你都试过什么?什么不起作用?这当然有效,这是我最初采用的方法,但这是一个过程性的if/thens,我想知道是否有更好的方法来做到这一点,即减少代码和/或提高效率?这当然有效,也是我最初采用的方法,但这是一个过程性的if/thens,我想知道是否有更好的方法来做到这一点,即减少代码和/或提高效率?