2017-02-08 18 views
0

У меня есть этот JSON данные:PHP Group По значению - JSON

"slots": [ 
     { 
     "start": "2017-02-09 08:00:00", 
     "end": "2017-02-09 08:20:00" 
     }, 
     { 
     "start": "2017-02-09 08:20:00", 
     "end": "2017-02-09 08:40:00" 
     }, 
     { 
     "start": "2017-02-09 08:40:00", 
     "end": "2017-02-09 09:00:00" 
     }, 
     { 
     "start": "2017-02-10 08:40:00", 
     "end": "2017-02-10 09:00:00" 
     }, 
     { 
     "start": "2017-02-10 09:00:00", 
     "end": "2017-02-10 09:20:00" 
     }, 
     { 
     "start": "2017-02-10 09:20:00", 
     "end": "2017-02-10 09:40:00" 
     } 

Я хотел бы разделить «старт» DATETIME на сегодняшний день $ и $ времени. Он работает с этим:

echo '<select name="reservationDate" id="test">'; 
      foreach($slots_start as $option){ 
       $dateTime = $option->start; 
       list($date, $time) = explode(" ", $dateTime); 
       echo '<option value=' . $date. '>' . $date . '</option>'; 
      } 
      echo '</select>'; 

С приведенным выше кодом я вижу раскрывающийся список со всеми значениями, разделенными на $ date.

Теперь я хочу сгруппировать по $ date, а затем показать $ time grouped в другом выпадающем списке.

См Схеме: image scheme

+0

вы должны сделать массив, где ключ $ дата, и значение является массивом $ time, first ... – Random

ответ

-1

Вам нужно создать яваскрипт массив PHP.

https://jsfiddle.net/bruvygjf/

<?php 
$json_str =<<<EOF 
[ 
     { 
     "start": "2017-02-09 08:00:00", 
     "end": "2017-02-09 08:20:00" 
     }, 
     { 
     "start": "2017-02-09 08:20:00", 
     "end": "2017-02-09 08:40:00" 
     }, 
     { 
     "start": "2017-02-09 08:40:00", 
     "end": "2017-02-09 09:00:00" 
     }, 
     { 
     "start": "2017-02-10 08:40:00", 
     "end": "2017-02-10 09:00:00" 
     }, 
     { 
     "start": "2017-02-10 09:00:00", 
     "end": "2017-02-10 09:20:00" 
     }, 
     { 
     "start": "2017-02-10 09:20:00", 
     "end": "2017-02-10 09:40:00" 
     } 
] 
EOF; 
$slots = json_decode($json_str); 

$times = array(); 

foreach($slots as $option){ 
    list($date, $time) = explode(" ", $option->start); 

    if (!array_key_exists($date, $times)){ 
     $times[$date] = array(); 
    } 

    if (!in_array($time, $times[$date])){ 
     $times[$date][] = $time; 
    } 
} 

echo '<select name="reservationDate" id="firstSelect" onchange="fillSecond()">'; 

foreach (array_keys($times) as $date){ 
    echo ' 
    <option value="' . $date. '">' . $date . '</option>'; 
} 
echo '</select>'; 

echo '<select name="reservationTime" id="secondSelect"></select>'; 
?> 

<script language="javascript"> 
function fillSecond(){ 
    firstSelectElement = document.getElementById('firstSelect'); 
    secondSelectElement = document.getElementById('secondSelect'); 
    times = date_options[firstSelectElement.selectedIndex]; 

    while (secondSelectElement.options.length > 0) {     
     secondSelectElement.remove(0); 
    } 

    for(var i = 0; i < times.length; i++) { 
     var new_option = document.createElement('option'); 
     new_option.innerHTML = times[i]; 
     new_option.value = times[i]; 
     secondSelectElement.appendChild(new_option); 
    } 
} 

date_options = []; 
<?php 
foreach($times as $date => $times){ 
    echo "date_options.push([]);"; 
    foreach ($times as $time){ 
     echo "date_options[date_options.length - 1].push('$time');"; 
    } 
} 
?> 

fillSecond(); 
</script> 
+0

Это определенно не очень хорошая практика для вывода JS-кода из PHP. –

+0

Привет, спасибо! Он работает, если я открою страницу, содержащую код. У меня есть эта ошибка, если вызывается обработкой ajax с другой страницы php: 'Uncaught TypeError: Невозможно прочитать свойство 'length' undefined' – Leon

+0

Это зависит от того, есть ли у вас небольшой объем данных. PHP используется для вывода HTML, поэтому я не вижу проблем с использованием PHP, если вы фильтруете вывод ввода и выхода. Вы всегда можете использовать Ajax в производстве. – jetblack

0

Вы могли группировать данные, а затем заполнить оба выпадающие.

<?php 

// group data 
$grouped = []; 
foreach($slots_start as $option){ 
    $dateTime = $option->start; 
    list($date, $time) = explode(" ", $dateTime); 
    if (isset($grouped[$date])) { 
    $grouped[$date][] = $time; 
    } else { 
    $grouped[$date] = [$time]; 
    } 
} 

Затем выведите оба выпадающих меню.

Вы можете получить массив дат с

$dates = array_keys($grouped); 

И каждый раз, связанный с этой датой с:

$times = $grouped[$date]; 

Таким образом, вы получите гораздо больше mantainable кода. Надеюсь, это поможет.

+0

Я пробую ваше решение. Как я могу заполнить второй выпадающий список? '$ dates = array_keys ($ grouped); \t \t $ times = $ grouped [$ date]; \t \t echo '