2015-04-06 110 views
0

我在使用PHP时遇到foreach和嵌套arrays的问题。我得到了整个foreach ($var as $newvar)等,但我遇到了一个新的要求,我似乎无法弄清楚/ vizualize。这里有一个简单的查询:Foreach和嵌套数组的问题

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) 

所有这些数据有望和正在工作。

问题是我找不出PHP逻辑运行每个主机名的foreach,然后遍历每个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个服务器在此ResultSet,但2项我想也遍历),我想遍历两个disk_mountpoint的,并能够操纵数据数据库中的表格行。另外美中不足的是,我需要能够报到我的所有项目,并在格式返回的东西:

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

所以,对于这两个项目样本输出会沿着线的东西:

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

我从来没有在PHP这样做,有一个很难搞清楚如何把逻辑代码。

回答

0

根据您的描述和样本输出它不是完全清楚为什么你需要把它当作一个嵌套的数组,但由于数据库查询总是返回一个列表,你会先通过的结果,将它们转换成回路到如下所示的嵌套数组,然后你可以通过循环来做你所需要的。

$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 
    } 
} 
+0

这让我关注一个'hostname',但不让我在基于相同主机名的多行上工作。我不确定如何按照上面解释的方式为单个主机名管理多个项目。有什么想法? – drewrockshard 2015-04-06 02:55:29

+0

我已经更新了我的第一个代码示例,以显示单个主机中的行的第二个循环。这是你需要的吗?如果没有,也许你可以包含更多的代码来显示你正在尝试使用单个主机的每组行。 – theark40 2015-04-06 06:38:35