PHP переключить регистр, 0 не распознается как значение? - PullRequest
0 голосов
/ 14 июля 2020

У меня есть оператор switch case в сценарии PHP, который возвращает строковое значение на основе значений 'Day' и 'Hour', предоставленных вызовом Ajax из файла JS. Но всякий раз, когда значения являются 0 (то есть воскресенье для переменной дня и 0, как в полночь для переменной часа) оператор не работает, и значение возвращается пустым. Кажется, я не могу найти решение, вот более короткая версия кода для PHP функция и Ajax Call;

function getDayTimeData($day, $time){
    $program = "";
    switch($day){
        case 0: //Sunday
            switch($time){
                case $time < 1:
                    $program = 'Be Our Guest';
                    break;
                case $time < 6:
                    $program = 'Club Technoise';
                    break;
                case $time < 12:
                    $program = 'Morning Juice';
                    break;
                case $time < 21:
                    $program = 'Detox';
                    break;
                case $time < 24:
                    $program = 'Disco Ball';
                    break;
            }
            break;
     }
}
if(isset($_POST["DayData"]) && isset($_POST["TimeData"]))
{
    echo(getDayTimeData($_POST["DayData"],$_POST["TimeData"]));
}

Вот Jquery Ajax Script

function getDayTimeAjax(_day,_time){
    var def2 = $.Deferred();
    
    setTimeout(function(){
        if(xhr && xhr.readyState != 4){
            xhr.abort();
        }
        var xhr = $.ajax({
            type: 'post',
            url: 'returnPoster.php',
            contentType: "application/x-www-form-urlencoded; charset=UTF-8",
            data: {DayData: _day, TimeData: _time},
            dataType: 'text',
            success: function(x){
                programInfo = x;
                def2.resolve();
            }
        })
    },2000);
    return $.when(def2).done(function(){}).promise();
}

var d = new Date();
var programInfo = ".";

setInterval(function () { updateProgram() }, 3000);

function updateProgram(){
    getDayTimeAjax(d.getDay(),d.getHours()).done(function(){
        console.log(programInfo.trim());
    })
}

EDIT: Извините, ребята выглядят как будто я дал некоторую дезинформацию по этому поводу, так как я очень спешил, когда настраивал эту ветку. Проблема возникает только тогда, когда значение $ time равно 0 . Значения кажутся прекрасными до тех пор, пока "case $ time <1: "выполняется операция. Оттуда, даже если переменная $ time имеет значение 0, он не выполняет блок кода внутри первого случая, поэтому программная переменная остается пустой. Все остальные значения возвращают значения из оператора switch . </p>

Ответы [ 4 ]

1 голос
/ 14 июля 2020

Вот небольшой пример. Это будет отражать программу, основанную на времени. Для определения дня я рекомендую использовать IF вместо корпуса переключателя.

$time = date("H");
$day = date("w");
$program = "";

if($day == 0){
  switch($time){
    case $time < 1:
      $program = 'Be Our Guest';
      break;
    case $time < 6:
      $program = 'Club Technoise';
      break;
    case $time < 12:
      $program = 'Morning Juice';
      break;
    case $time < 21:
      $program = 'Detox';
      break;
    case $time < 24:
      $program = 'Disco Ball';
      break;
    }
  }else{
     .......
  }
echo $program;
1 голос
/ 14 июля 2020

Вы не можете сравнивать целочисленное значение и время вот так,

switch($time){
    case $time < 1:
      break;
}

попробуйте сравнить значения одного и того же типа.

1 голос
/ 14 июля 2020

Ваша проблема связана с оператором switch, если вы возьмете это:

    switch($time){
        case $time < 1:
        ...
    }

И заполните значение для $ time, например 0:

    switch(0){
        case 0 < 1:
        ...
    }

Затем сравните значение в вызове switch() значения после case:

0 == true

Ну, это - и все другие сравнения - это false. Если вы действительно хотите использовать сравнение с использованием меньше-чем в операторе switch, вам нужно будет сделать следующее:

    switch(true){
        case $time < 1:
        ...
    }

Тогда сравнение будет:

true == true

Примечание что в вашем исходном коде, когда значение для $time не равно 0, он будет сравнивать, например, 3 == true, который, поскольку switch не проверяет строго (он использует ==, а не ===), равен true. Он будет всегда возвращать первый результат «Будь нашим гостем», независимо от значения.

0 голосов
/ 14 июля 2020

Думаю, вы можете попробовать это, он может работать и с первым переключателем, но я предпочитаю использовать , если вместо :

function getDayTimeData ($day, $time)
{
    if ((int) $day === 0) {
        switch($time){
            case $time < 1:
                $program = 'Be Our Guest';
            break;
            case $time < 6:
                $program = 'Club Technoise';
            break;
            case $time < 12:
                $program = 'Morning Juice';
            break;
            case $time < 21:
                $program = 'Detox';
            break;
            case $time < 24:
                $program = 'Disco Ball';
            break;
        }
    }
}

if(isset($_POST["DayData"]) && isset($_POST["TimeData"]))
{
    echo(getDayTimeData($_POST["DayData"],$_POST["TimeData"]));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...