2015-04-06 84 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