2013-07-29 2 views
0

Я бы хотел, чтобы мой массив сортировался по уникальному дню и показывал только одно значение дня один раз со всеми включенными для этого дня.показать результаты массива, отсортированные по уникальному дню

Желаемая Пример:

Неформальная

Понедельник: 2 вечера до 3 вечера, 3 вечера до 4 вечера, 4 вечера до 5 вечера

Вторник: 2 вечера до 3 вечера, 3 вечера до 4 вечера, 4 вечера до 5 вечера

Среда: 2PM до 3PM, 3PM до 4PM, 4P M к 5PM

четверг: 2 вечера до 3 вечера, 3 вечера до 4 вечера, 4PM к 5PM


В настоящее время я получаю это с днем ​​итерацию каждый раз. Понедельник: 2 вечера до 3 вечера, понедельник с 3 вечера до 4 вечера, понедельник с 4 вечера до 5 вечера Вторник: 2 вечера до 3 вечера, вторник 3 вечера до 4 вечера, вторник 4 вечера до 5 вечера и так далее.


Вот мой массив:

["Informal"]=> array(12) { 
[0]=> array(1) { ["Schedule"]=> array(4) { ["program"]=> string(8) "Informal" ["day"]=> string(6) "Monday" ["start_time"]=> string(4) "2 PM" ["end_time"]=> string(4) "3 PM" } } 
[1]=> array(1) { ["Schedule"]=> array(4) { ["program"]=> string(8) "Informal" ["day"]=> string(6) "Monday" ["start_time"]=> string(4) "3 PM" ["end_time"]=> string(4) "4 PM" } } 
[2]=> array(1) { ["Schedule"]=> array(4) { ["program"]=> string(8) "Informal" ["day"]=> string(6) "Monday" ["start_time"]=> string(4) "4 PM" ["end_time"]=> string(4) "5 PM" } } 
[3]=> array(1) { ["Schedule"]=> array(4) { ["program"]=> string(8) "Informal" ["day"]=> string(7) "Tuesday" ["start_time"]=> string(4) "2 PM" ["end_time"]=> string(4) "3 PM" } } 
[4]=> array(1) { ["Schedule"]=> array(4) { ["program"]=> string(8) "Informal" ["day"]=> string(7) "Tuesday" ["start_time"]=> string(4) "3 PM" ["end_time"]=> string(4) "4 PM" } } 
[5]=> array(1) { ["Schedule"]=> array(4) { ["program"]=> string(8) "Informal" ["day"]=> string(7) "Tuesday" ["start_time"]=> string(4) "4 PM" ["end_time"]=> string(4) "5 PM" } } 
[6]=> array(1) { ["Schedule"]=> array(4) { ["program"]=> string(8) "Informal" ["day"]=> string(9) "Wednesday" ["start_time"]=> string(4) "2 PM" ["end_time"]=> string(4) "3 PM" } } 
[7]=> array(1) { ["Schedule"]=> array(4) { ["program"]=> string(8) "Informal" ["day"]=> string(9) "Wednesday" ["start_time"]=> string(4) "3 PM" ["end_time"]=> string(4) "4 PM" } } 
[8]=> array(1) { ["Schedule"]=> array(4) { ["program"]=> string(8) "Informal" ["day"]=> string(9) "Wednesday" ["start_time"]=> string(4) "4 PM" ["end_time"]=> string(4) "5 PM" } } 
[9]=> array(1) { ["Schedule"]=> array(4) { ["program"]=> string(8) "Informal" ["day"]=> string(8) "Thursday" ["start_time"]=> string(4) "2 PM" ["end_time"]=> string(4) "3 PM" } } 
[10]=> array(1) { ["Schedule"]=> array(4) { ["program"]=> string(8) "Informal" ["day"]=> string(8) "Thursday" ["start_time"]=> string(4) "3 PM" ["end_time"]=> string(4) "4 PM" } } 
[11]=> array(1) { ["Schedule"]=> array(4) { ["program"]=> string(8) "Informal" ["day"]=> string(8) "Thursday" ["start_time"]=> string(4) "4 PM" ["end_time"]=> string(4) "5 PM" } } } 

возможно с этим массивом или мне нужно сделать, чтобы изменить свой SQL запрос? Я пробовал GROUP BY 'day', но это не сработало. Я также попытался вложить петлю foreach времени в пределах цикла foreach дня, который, как я думаю, является способом выхода, но я не понимаю его.

вот PHP/HTML без его вложенными

<h1>Schedules</h1> 
<h2>Room 1</h2> 
<?php 
$array = array(); 
foreach ($data as $row) { 
    $data[$row['Schedule']['program']][] = $row; 
} 
?> 
<?php foreach ($array as $program => $schedules) { ?> 
<h3><?php echo $program; ?></h3> 
<fieldset class="programs"> 
<!-- data rows --> 
<?php foreach ($schedules as $key => $schedule) : 
echo $schedule['Schedule']['day']. " : " .$schedule['Schedule']['start_time'];?> to <?php echo $schedule['Schedule']['end_time'] . " <br /> "; 
endforeach; ?> 
</fieldset> 
+0

Что ваш sql-запрос? в зависимости от структуры таблицы вы можете использовать GROUP_CONCAT для группировки запланированных часов для каждого дня в список, разделенный запятыми, который вы могли бы просто «взорвать» в php-коде. –

ответ

1

Это будет что-то вроде этого:

<?php foreach ($array as $program => $schedules) { ?> 
<h3><?php echo $program; ?></h3> 
<fieldset class="programs"> 
<!-- data rows --> 
<?php 
$i = 0; 
foreach ($schedules as $key => $schedule) : 

    if ($i === 0) { 
     echo $schedule['Schedule']['day'] . ': '; 
     ++$i; 
    } 
echo $schedule['Schedule']['start_time'];?> to <?php echo $schedule['Schedule']['end_time']; 
if (isset($schedules[$key +1 ]['Schedule']['day'])) { 
if ($schedule['Schedule']['day'] === $schedules[$key +1 ]['Schedule']['day']) { 
echo ', '; 
} else { 
    echo '</br> ' .$schedules[$key +1 ]['Schedule']['day'] . ': '; 
} 
} 
endforeach; ?> 
</fieldset> 
+0

Это выглядит неплохо, но я получаю неопределенное смещение для обеих строк с помощью [$ key +1] после того, как он вернет желаемые результаты. Нужно ли мне отменить? – sloga

+0

Вы догадались об ошибке на последней строке? – Perry

+0

да, вместе с дополнительным «:» – sloga

1
<h1>Schedules</h1> 
<h2>Room 1</h2> 
<?php 
$array = array(); 
foreach ($data as $row) { 
    $data[$row['Schedule']['program']][] = $row; 
} 
?> 
<?php foreach ($array as $program => $schedules) { ?> 
<h3><?php echo $program; ?></h3> 
<fieldset class="programs"> 
<p> 
<!-- data rows --> 
<?php $current = ''; ?> 
<php $counter = 0; ?> 
<?php foreach ($schedules as $key => $schedule) : 
echo $current != $schedule['Schedule']['day'] ? '</p><p>'.$schedule['Schedule']['day']. " : " : ''; 
echo ($counter!=0 ? ', ' : '') . $schedule['Schedule']['start_time'];?> to <?php echo $schedule['Schedule']['end_time']; 

$current = $schedule['Schedule']['day']; 
$counter++; 
endforeach; ?> 
</p> 
</fieldset> 

Примечание: код не тестировался.

Редактировать: Код обновлен. Это не лучший способ сделать это, но он работает. Лучшим вариантом может быть создание запроса, который будет получать все дни и уступающие часы, как предлагается @patrik ниже.

+0

Это выглядит хорошо, но есть ли способ разместить каждый новый день на следующей строке? – sloga

0

Использование CONCAT с GROUP_CONCAT

SELECT 
day 
GROUP_CONCAT(CONCAT(start_time, " to ", end_time)) as hours 
FROM 
sometable 
GROUP BY 
day 

Ваши возвращаемые строки из запроса тузд Бы структуру как

array( 
    array("day"=>"Monday","hours"=>"2pm to 3pm, 3pm to 4pm, 4pm to 5pm"), 
    array("day"=>"Tuesday","hours"=>"2pm to 3pm, 3pm to 4pm, 4pm to 5pm") 
) 
Смежные вопросы