gpt4 book ai didi

php - 如何使用 PHP 将 MySQL 查询结果作为嵌套数组获取?

转载 作者:行者123 更新时间:2023-11-29 19:35:14 24 4
gpt4 key购买 nike

假设我有一个简单的表,其中 pos_level 是位置的级别,pos_under 是其上方位置的 PID。

在第 1 级,我有“总经理”和“主管”。

在第 2 级,“总经理(PID:1)”下:“助理”。 “经理”,“主管(PID:2)”下:“营销”。

在第 3 级,“助理”下。经理(PID:3)':'销售'和'采购',在'营销(PID:2):无。

+-----+-----------------+-----------+-----------+
| PID | pos_name | pos_level | pos_under |
+-----+-----------------+-----------+-----------+
| 1 | General Manager | 1 | 0 |
| 2 | Supervisor | 1 | 0 |
| 3 | Asst. Manager | 2 | 1 |
| 4 | Sales | 3 | 3 |
| 5 | Purchase | 3 | 3 |
| 6 | Marketing | 2 | 2 |
+-----+-----------------+-----------+-----------+

现在我该如何进行查询,以便得到一个嵌套数组作为结果,如下所示:

Array
(
[0] => Array
(
[pos_level] => 1
[pos_name] => General Manager
[pos_under] => Array
(
[0] => Array
(
[pos_level] => 2
[pos_name] => Asst. Manager
[pos_under] => Array
(
[0] => Array
(
[pos_level] => 3
[pos_name] => Sales
)

[1] => Array
(
[pos_level] => 3
[pos_name] => Purchase
)

)

)

)

)

[1] => Array
(
[pos_level] => 1
[pos_name] => Supervisor
[pos_under] => Array
(
[0] => Array
(
[pos_level] => 2
[pos_name] => Marketing
[pos_under] => Array
(
)

)

)

)

)

我尝试过使用多个查询并使用 array_push 使用结果,但我有大约 100+ pos_name 并且我认为这很困惑,我也尝试过使用循环来继续运行每个级别及以下的查询,还尝试使用每个级别有多个表,但我希望只能使用 1 个表,并且能够将结果作为上面的嵌套数组进行查询,以便在我的应用程序中进一步使用。

非常欢迎所有的回答、意见和建议。谢谢。

最佳答案

正如上面评论中提到的,我总体上怀疑您所遵循的方法是一个好的方法。那是因为它无法扩展!您尝试从数据库中获取所有条目并将它们打包到单个分层数组中。这意味着您在内存中为每个条目创建多个副本。条目数量不断增加会发生什么?您面临脚本的内存消耗不断增加的情况,这显然会使其最终失败。

尽管如此,我还是接受了挑战,并实现了一个小演示,展示如何借助引用文献巧妙地构建此类嵌套结构。此类引用不仅简化了嵌套结构的创建,还通过防止一次又一次按值复制条目来减少内存占用。然而,这不能解决上述方法的一般缩放问题,它只能帮助减少它。

我还冒昧地对您的方法进行了一些小修改,并引入了一个新属性“pos_over”来保存条目下的条目。有两个原因:

  1. 删除原始可用数据通常不是一个好主意,尤其是不要用更改后的含义替换它
  2. 术语“pos_under”的含义是描述给定条目被放置在哪个其他条目之下。但从“上”条目的角度来看,“下面”的条目不应该被“pos_under”引用,对吗?这将与该术语的原始含义相矛盾。

出于演示目的,以下代码依赖于数据库。相反,它从 CSV 字符串中读取原始数据并对其进行解析。所需结构的实际构建通过注释进一步标记。还应该提到的是,代码期望原始数据仅在声明后才能引用其他条目。因此,如果从上到下处理另一个条目下的每个条目,则可以预期另一个条目已经存在。

请注意,构建该嵌套结构的实际代码仅包含 12 行巧妙的代码...

<?php

// the raw CSV data
$csvText = <<<CSV
PID|pos_name|pos_level|pos_under
1|General Manager|1|0
2|Supervisor|1|0
3|Asst. Manager|2|1
4|Sales|3|3
5|Purchase|3|3
6|Marketing|2|2
CSV;

// praparation of CSV data
foreach (explode("\n", $csvText) as $csvRow) {
$csvData[] = str_getcsv($csvRow, '|');
}
$csvTitle = array_shift($csvData);

$table = [];
foreach ($csvTitle as $titleKey=>$titleValue){
foreach ($csvData as $csvRow=>$csvColumn) {
foreach ($csvColumn as $csvKey=>$csvValue) {
$table[$csvRow][$csvTitle[$csvKey]] = $csvValue;
}
}
}

// creation of the structure
$catalog = [];
$structure = [];
foreach ($table as $key=>&$entry) {
$entry['pos_over'] = [];
if ($entry['pos_under'] == 0) {
$structure[] = &$entry;
$catalog[$entry['PID']] = &$structure[count($structure)-1];
} else {
$catalog[$entry['pos_under']]['pos_over'][] = &$entry;
$catalog[$entry['PID']] = &$catalog[$entry['pos_under']]['pos_over'][count($catalog[$entry['pos_under']]['pos_over'])-1];
}
}

// demonstration output
print_r($structure);

以上实验的输出为:

Array
(
[0] => Array
(
[PID] => 1
[pos_name] => General Manager
[pos_level] => 1
[pos_under] => 0
[pos_over] => Array
(
[0] => Array
(
[PID] => 3
[pos_name] => Asst. Manager
[pos_level] => 2
[pos_under] => 1
[pos_over] => Array
(
[0] => Array
(
[PID] => 4
[pos_name] => Sales
[pos_level] => 3
[pos_under] => 3
[pos_over] => Array
(
)

)

[1] => Array
(
[PID] => 5
[pos_name] => Purchase
[pos_level] => 3
[pos_under] => 3
[pos_over] => Array
(
)

)

)

)

)

)

[1] => Array
(
[PID] => 2
[pos_name] => Supervisor
[pos_level] => 1
[pos_under] => 0
[pos_over] => Array
(
[0] => Array
(
[PID] => 6
[pos_name] => Marketing
[pos_level] => 2
[pos_under] => 2
[pos_over] => Array
(
)

)

)

)

)

关于php - 如何使用 PHP 将 MySQL 查询结果作为嵌套数组获取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41586361/

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