【问题标题】:Trouble with foreach and nested arraysforeach 和嵌套数组的问题
【发布时间】:2015-04-06 01:45:37
【问题描述】:

我遇到了foreach 和 PHP 中嵌套的 arrays 的问题。我得到了整个foreach ($var as $newvar) 等,但我遇到了一个我似乎无法弄清楚/可视化的新要求。这是一个简单的查询:

select systems.hostname, capacity_disk.server_id, capacity_disk.disk_mountpoint, capacity_disk.disk_datetime, capacity_disk.disk_device, capacity_disk.disk_capacity, capacity_disk.disk_used, capacity_disk.disk_used_percent from systems left join capacity_disk on systems.id=capacity_disk.server_id where capacity_disk.disk_datetime = UNIX_TIMESTAMP(subdate(current_date,3)) and systems.id=44;

我得到以下结果:

+--------------------------------+-----------+-----------------+---------------+----------------------------+---------------+------------+-------------------+
| hostname                       | server_id | disk_mountpoint | disk_datetime | disk_device                | disk_capacity | disk_used  | disk_used_percent |
+--------------------------------+-----------+-----------------+---------------+----------------------------+---------------+------------+-------------------+
| server01.example.org           |        44 | /backup         |    1427950800 | /dev/mapper/storage-backup | 1870561476    | 1437491340 | 81%               | 
| server01.example.org           |        44 | /               |    1427950800 | /dev/mapper/storage-root   | 15126920      | 4286048    | 30%               | 
+--------------------------------+-----------+-----------------+---------------+----------------------------+---------------+------------+-------------------+
2 rows in set (0.01 sec)

所有这些数据都是预期的并且正在发挥作用。

问题是我无法弄清楚为每个主机名运行 foreach 的 PHP 逻辑,然后遍历每个 disk_mountpoint。显然,第一部分很简单:

$query = $db->Execute("select systems.hostname, capacity_disk.server_id, capacity_disk.disk_mountpoint, capacity_disk.disk_datetime, capacity_disk.disk_device, capacity_disk.disk_capacity, capacity_disk.disk_used, capacity_disk.disk_used_percent from systems left join capacity_disk on systems.id=capacity_disk.server_id where capacity_disk.disk_datetime = UNIX_TIMESTAMP(subdate(current_date,3)) and systems.id=44;");

foreach ($query as $server) {

}

此时我可以通过$server['hostname'] 引用主机名——这也很好。问题是 - 对于每个 $server['hostname'] 项目(此结果集中的 1 个服务器,但我还想遍历 2 个项目),我想遍历两个 disk_mountpoint 并能够操作数据库中表行中的数据。另一个问题是我需要能够报告我的所有项目并返回以下格式的内容:

'`disk_mountpoint`','`disk_capacity`','`disk_used_percent`'

因此,这两个项目的示例输出将类似于以下内容:

'/backup','1870561476','81%'
'/','15126920','30%'

我从来没有在 PHP 中这样做过,并且很难弄清楚如何将逻辑放入代码中。

【问题讨论】:

    标签: php arrays for-loop foreach


    【解决方案1】:

    根据您的描述和示例输出,尚不完全清楚为什么需要将其视为嵌套数组,但由于数据库查询始终返回单个列表,您首先必须遍历结果以将它们转换为一个嵌套数组,如下所示,然后你可以循环遍历它来做你需要的事情。

    $list_by_server = array(); // initialize an array to organize results by host name
    foreach ($query as $row) {
        $list_by_server[$row['hostname']] = $row;
    }
    
    foreach ($list_by_server as $server) {
        // any per server setup and actions go here
        foreach ($server as $disk) {
            // process disk details and update database
            // output disk details
        }
    }
    

    您还可以设置一个变量来跟踪当前服务器,如下所示并避免两个 foreach 循环。

    $current = ''; // initialize tracking car
    foreach ($query as $row) {
        if ($current == $row['hostname']) {
            // do something with another row from the current host
        } else  {
            // it's a new host 
            // do something with the row
            $current == $row['hostname']; // updates tracking var 
        }
    }
    

    【讨论】:

    • 这让我专注于一个hostname,但不会让我处理基于相同主机名的多行。我不确定如何按照我上面解释的方式管理单个主机名的多个项目。有什么想法吗?
    • 我更新了我的第一个代码示例,以显示单个主机中行的第二个循环。这是你需要的吗?如果没有,也许您可​​以包含更多代码,以显示您对单个主机的每组行的尝试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2014-12-11
    相关资源
    最近更新 更多