PHP Group By value - JSON



我有这个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"
      }

我想将日期时间"开始"拆分为$date和$time。它适用于这个:

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。

请参阅方案:图像方案

您可以先对数据进行分组,然后填充这两个下拉列表。

<?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];

这样,您将获得更多可保留的代码。希望对您有所帮助。

php with :

<select name="company" id="select_company">
        <option>Select...</option>
        <option value="1">Italy</option>
</select>
<select name="reservationDate" id="firstSelect">
        <option>Seleziona date</option>
</select>

//ajax
    $('#select_company').on('change', function(e) {
        e.preventDefault(); // Prevent Default Submission
        $.ajax({
            url: 'my_page.php',
            type: 'POST',
            data: $(this).serialize()
        })
        .done(function(data){
            $('#firstSelect').hide(function(){
                $('#firstSelect').show().html(data);
            });
        })
        .fail(function(){
            alert('Errore nel caricamento');    
        });
    });

并my_page.php:

    <?php
    if(isset($_POST))
        {
...//my code for get json array
        $times = array();
                    foreach($slots_start 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>
                    <?php
            }?>

你需要用php创建javascript数组。

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>

最新更新