【问题标题】:How to create a three dimensional array from sql query PHP如何从 sql 查询 PHP 创建一个三维数组
【发布时间】:2020-11-04 21:48:45
【问题描述】:

我在数据库中有 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 的列中为我提供第四个结果 等等

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

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

【问题讨论】:

  • 听起来您将尝试在 php 中做一些数据库更适合做的事情...但是如果您查看查询的结果(显示两者的所有字段表),一个模式应该呈现出来。您可能可以使用主键作为数组索引。老实说,我并没有遵循您要尝试做的事情,因为这听起来比应该做的要复杂得多。请记住,必须有人维护这个东西!
  • @TimMorton 不,这些表没有模式,我想在 SQL 中进行查询,然后将结果放入 PHP 数组中,但我不确定如何为 3 维数组执行此操作,对于二维数组,我只使用$row = mysqli_fetch_assoc($query)
  • 你能在你的问题中给出大约 10 行的结果吗?为了实现数组的目标,您必须使用 db 主键作为关联数组的键;这是您能够跟踪“table1 行”的唯一方法。否则,您最终会在每个 db 行中增加第一个索引。
  • 如果你把它想象成一个数组,它可能会更容易想象。外层数组表示表1的每一行,每个数组位置存储的值是匹配表2行的数组。
  • @TimMorton 这正是我要问的,我将如何制作这个数组数组

标签: php arrays


【解决方案1】:

假设我们有两个表,Company 和 Employee:

  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) { ... }

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

最后,最好还是简单地进行另一个查询,然后让数据库为您提供所需的具体结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 2016-02-28
    • 2016-12-07
    相关资源
    最近更新 更多