繁体   English   中英

如何从 sql 查询 PHP 创建一个三维数组

[英]How to create a three dimensional array from sql query PHP

我在数据库中有 2 个表,其中 1 个与第一个的外键链接。 表 1 上的每一行都链接到表 2 中的多行。我试图进行一个查询,该查询查看表 2 中的WHERE并返回表 2 中的多行,这些行被排序到它们在表 1 中链接的行中,然后把这一切放到一个大的多维数组中,所以它应该像这样工作:

$array[0][column_name][0]这将使用表 1 中的第 1 行,并在名为column_name的列中给出第一个结果$array[1][column_name][0]这将使用表 1 中的第 2 行并在名为column_name $array[1][column_name][3]的列中给我一个第一个结果,这将使用表 1 中的第 2 行,并在名为column_name等的列中给我第 4 个结果

如何使用 PHP 查询并将其存储在 3 维数组中。

我试图以尽可能清晰的方式表达这一点,如果您不确定我在问什么,请发表评论,我会更新我的问题以使其更清楚。

假设我们有两个表,公司和员工:

  Company
------------------
ID   Company_Name
 1    Walmart
 2    Amazon.com
 3    Apple

       Employee
---------------------------------       
ID Company_Id Employee_Name
 1         1   Sam Walton
 2         1   Rob Walton
 3         1   Jim Walton
 4         1   Alice Walton
 5         2   Jeff Bezos
 6         2   Brian T. Olsavsky
 7         3   Steve Jobs
 8         3   Tim Cook 

设想一个多维(嵌套)数组的最简单方法是模拟获取它所需的循环:外循环是公司,内循环是员工:

// ignoring database access, this is just pseudo code

$outer = [];
// select id, company_name from company
foreach $companyResult as $companyRow {

    // select * from employee where company_id = ?  {$companyRow['id']}
    $inner= [];
    foreach $employee_result as $employeeRow {
        $inner[] = $employeeRow;  // ie, ['id'=>'1','Company_Id'=>'1','Employee_Name'=>'Sam Walton']
    }

    $outer[] = $inner;
}

print_r($outer);

// yields ====>

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [Company_Id] => 1
                    [Employee_Name] => Sam Walton
                )

            [1] => Array
                (
                    [id] => 2
                    [Company_Id] => 1
                    [Employee_Name] => Rob Walton
                )

            [2] => Array
                (
                    [id] => 3
                    [Company_Id] => 1
                    [Employee_Name] => Jim Walton
                )

            [3] => Array
                (
                    [id] => 4
                    [Company_Id] => 1
                    [Employee_Name] => Alice Walton
                )
        )

    [1] => Array
        (
            [0] => Array
                (
                    [id] => 5
                    [Company_Id] => 2
                    [Employee_Name] => Jeff Bezos
                )

            [1] => Array
                (
                    [id] => 6
                    [Company_Id] => 2
                    [Employee_Name] => Brian T. Olsavsky
                )

        )

    [2] => Array
        (
            [0] => Array
                (
                    [id] => 7
                    [Company_Id] => 3
                    [Employee_Name] => Steve Jobs
                )

            [1] => Array
                (
                    [id] => 8
                    [Company_Id] => 3
                    [Employee_Name] => Tim Cook
                )

        )

)

如果您使用关联数组,也可以这样做。 考虑此查询生成的平面文件:

select company.id company_id, company.name company_name, 
       emp.id employee_id, emp.employee_name
from company 
inner join employee on company.id = employee.company_id

-----

    company_id company_name employee_id employee_name
            1       Walmart           1        Sam Walton
            1       Walmart           2        Rob Walton
            1       Walmart           3        Jim Walton
            1       Walmart           4      Alice Walton
            2    Amazon.com           5        Jeff Bezos
            2    Amazon.com           6 Brian T. Olsavsky
            3         Apple           7        Steve Jobs
            3         Apple           8          Tim Cook

只需使用主 ID 作为数组的键:

$employeeList = [];
foreach($result as $row) {

  $cid = $row['company_name'];
  $eid = $row['employee_name'];
  // avoid uninitialized variable
  // $employeeList[$row['company_name']] = $employeeList[$row['company_name']] ?? [];

  // easier to read version of above
  $employeeList[$cid] = $employeeList[$cid] ?? [];

  // assign it...
  $employeeList[$cid][$eid] = $row;
}

或者,如果您只是希望公司的每一行都包含一组员工姓名,

  $employeeList[$cid][] = $row['employee_name'];

如果您知道 company_id 并想查找相关行,我向您展示的方式很有用:

foreach($employeeList[2] as $amazon_guys) { ... }

但是,如果您尝试按员工或员工表中的某些其他字段进行分组,则它根本没有用。 您必须按所需的搜索顺序组织索引的顺序。

最后,简单地执行另一个查询并让数据库为您提供所需的特定结果几乎总是更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM