2015-04-06 3 views
0

У меня проблема с foreach и вложенная arrays в PHP. Я получаю весь foreach ($var as $newvar) и такой, но я столкнулся с новым требованием, которое я, похоже, не могу понять/визуализировать. Вот простой вопрос:Проблема с 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 сервер в этом наборе результатов, но 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

+0

Я обновил первый пример кода, чтобы показать второй цикл для строк внутри одного хоста. Это то, что тебе надо? Если нет, возможно, вы можете включить больше своего кода, чтобы показать, что вы пытаетесь с каждой группой строк для отдельного хоста. – theark40

Смежные вопросы