簡體   English   中英

PHP按值分組-JSON

[英]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"
      }

我想將dateTime“ start”拆分為$ 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的與:

<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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM