2016-05-31 9 views
1

У меня есть array и используя foreach петли я пытаюсь проверить, если dinner_date соответствует предыдущему индексу dinner_date и если они не я назначаю yes к переменному называется $newDate Это то, что вывод выглядит линиюНевозможно сравнить две дату

array:4 [▼ 
    0 => array:3 [▼ 
    "request_id" => "48" 
    "dinner_date" => "2016-05-16T10:00:00" 
    "new_date" => "no" 
    ] 
    1 => array:3 [▼ 
    "request_id" => "51" 
    "dinner_date" => "2016-05-16T10:00:00" 
    "new_date" => "no" 
    ] 
    2 => array:3 [▼ 
    "request_id" => "50" 
    "dinner_date" => "2016-05-27T10:00:00" 
    "new_date" => "no" 
    ] 
    3 => array:3 [▼ 
    "request_id" => "52" 
    "dinner_date" => "2016-05-27T10:00:00" 
    "new_date" => "no" 
    ] 
] 

Это мой foreach петля

$dinnerDetails = array(); 
$lastDinnerDate = ''; 
$newDate = ''; 
foreach ($invitations as $invitation) { 
    $lastDinnerDate = $invitation['dinner_date']; 
    if ($invitation['dinner_date'] > $lastDinnerDate) { 
     $newDate = 'yes'; 

    } else { 
     $newDate = 'no'; 
    } 

    $dinnerDetails[] = array(
     'request_id' => $invitation['request_id'], 
     'dinner_date' => $invitation['dinner_date'], 
     'new_dinner' => $newDate 
    ); 
} 

так как вы можете видеть в индексе 2 из массив, он говорит new_date => no, он должен быть фактически yes, потому что dinner_date этого показателя отличается от dinner_date указанного выше индекса.

Так что я делаю неправильно здесь?

+1

в вашем случае они оба одинаковы, вам нужно сохранить '$ lastDinnerDate = $ invite ['dinner_date'];' после условия. –

+1

Назначить '$ lastDinnerDate = $ invite ['dinner_date'];' как самое последнее действие в цикле, а не как первое –

+0

Какой формат даты вашего обеда? –

ответ

1

Комментарий: В вашем случае они оба такие же, вам нужно хранить $lastDinnerDate = $invitation['dinner_date']; после состояния.

Добавьте еще одно условие $lastDinnerDate != "" к вашему условию if и назначьте `` после условия in.

Для сравнения вам необходимо преобразовать дату и время в метку времени.

foreach ($invitations as $invitation) { 

    if (strtotime($invitation['dinner_date']) > $lastDinnerDate && $lastDinnerDate != "") { 
     $newDate = 'yes'; 

    } else { 
     $newDate = 'no'; 
    } 
    $lastDinnerDate = strtotime($invitation['dinner_date']); 

    $dinnerDetails[] = array(
     'request_id' => $invitation['request_id'], 
     'dinner_date' => $invitation['dinner_date'], 
     'new_dinner' => $newDate 
    ); 
} 
+1

Спасибо, это помогло – Saadia

+0

Сравнение объектов DateTime может быть выполнено с помощью арифметических операторов. PHP перегружает операторы сравнения внутри –

+0

Так что, если я не конвертирую время в метку времени, он будет работать нормально, как вы говорите. @MichelFeldheim. Правильно? –

1

Изменить его к этому:

$lastDinnerDate = ''; 
foreach ($invitations as $invitation) { 
    $lastDinnerDate = $invitation['dinner_date']; 
    $newDate = 'no'; 
    if ($lastDinnerDate != "") { 
     if ($invitation['dinner_date'] > $lastDinnerDate) { 
      $newDate = 'yes'; 
     } else { 
      $newDate = 'no'; 
     } 
    } 
    $lastDinnerDate = $invitation['dinner_date']; 
    $dinnerDetails[] = array(
     'request_id' => $invitation['request_id'], 
     'dinner_date' => $invitation['dinner_date'], 
     'new_dinner' => $newDate 
    ); 
} 
0

Основная проблема здесь состоит в том, что вы храните одинаковые значения в каждом цикле, так что две даты будут же каждый раз, таким образом, исполнение никогда не достигнет ветви «да».

Кроме того, вы пытаетесь применить арифметический оператор сравнения для двух строк, которые будут предоставлять поддельные результаты:

$invitation['dinner_date'] > $lastDinnerDate 

Все, что вам нужно сделать, это использовать strtotime(). Это в основном разбирает любой формат даты в метку времени, которую можно сравнить регулярно:

strtotime($invitation['dinner_date']) > strtotime($lastDinnerDate) 

может разобрать широкий выбор даты строк, для получения дополнительной информации, посетите datetime.formats в официальном руководстве.

+0

Да, я пробовал это и не работал, ответ @Frayne помог, и он работает сейчас, большое спасибо за отзывы. – Saadia

+0

Да, сравнение строк - приятное прикосновение. Если формат даты не изменится, это будет прекрасно! –

Смежные вопросы