gpt4 book ai didi

PHP - 来自 MySQL 行值的关联数组级别

转载 作者:行者123 更新时间:2023-11-30 22:08:52 26 4
gpt4 key购买 nike

模型

我有一个包含多个类别和与对象关联的值的数据库,因此元素 X 可以有一个值为“塞维利亚”的“城市”、一个值为“西类牙”的“国家”,等等。数据库方案如下:

+------------+-------------+----------+
| element_id | category_id | value_id |
+------------+-------------+----------+
| 1 | 1 | 1 |
| 1 | 2 | 5 |
| 1 | 3 | 2 |
+------------+-------------+----------+

当然,这些链接到我存储这些 ID 值的其他表。

开始

用户可以选择按照用户想要的顺序查看按类别分组的元素。因此,用户可能希望查看按“国家”分组的元素,然后再按“城市”分组。或者可能是“城市”,然后是“街区”。等等。

用户定义组的顺序,用户决定“什么里面有什么”。

查询数据库后得到的结果

我从查询中得到了一个结果(所以,我已经完成了查询,这将是我将使用 fetch_object() 获得的信息)具有以下结构(和示例数据):

+----+-----------+-------------+
| id | value | category_id |
+----+-----------+-------------+
| 1 | Spain | 1 |
| 1 | Sevilla | 2 |
| 2 | Portugal | 1 |
| 2 | Lisboa | 2 |
| 3 | Spain | 1 |
| 3 | Barcelona | 2 |
| 4 | Spain | 1 |
| 4 | Sevilla | 2 |
+----+-----------+-------------+

我想要什么

我想做的是最终在 PHP 中有一个关联数组,如下所示:

array(2) {
["Portugal"]=>
array(1) {
["Lisboa"]=>
array(1) {
[0]=>
array(1) {
["id"]=>
int(2)
}
}
}
["Spain"]=>
array(2) {
["Sevilla"]=>
array(2) {
[0]=>
array(1) {
["id"]=>
int(1)
}
[1]=>
array(1) {
["id"]=>
int(4)
}
}
["Barcelona"]=>
array(1) {
[0]=>
array(1) {
["id"]=>
int(3)
}
}
}
}

因此,按照出现顺序,与前一个元素具有相同 ID 的每个元素都会进入关联数组的新子级,并最终得到一个包含所有具有相同路径的元素的对象数组。

请记住,可以有不同级别的深度,所以也许(由用户选择)可以是“Sevilla”下的另一个 value,所以我不能为所有内容设置变量这可能会发生,因为它取决于用户。

我一直在努力寻找如何去做,但我一直没能做到。我找到了 array_walk()this question但是,尽管这是一个类似的案例,但我没有想到如何应用它来获得预期的结果。

谢谢。

最佳答案

这个数据结构很丑。考虑改为更改您的查询。我写这个是为了$result数组迭代,但是很容易切换到fetch_object while循环(不知道你得到的是什么对象)。

$data = [];
$city = $country = $id = null;
foreach ($result as $row) {
if ($id != $row['id']) {
$id = $row['id'];
$country = $row['value'];
isset($data[$country]) or $data[$country] = [];
continue;
}

$city = $row['value'];
isset($data[$country][$city]) or $data[$country][$city] = [];
$data[$country][$city][] = ['id' => $id];
}

关于PHP - 来自 MySQL 行值的关联数组级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40770079/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com