За последние 24 часа нас посетили 22964 программиста и 1213 роботов. Сейчас ищут 663 программиста ...

Странное поведение strtotime, помогите исправить функцию

Тема в разделе "PHP для новичков", создана пользователем Artur_hopf, 11 фев 2019.

  1. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Добрый день. Стряпал функцию для построения графика. Выглядит так:
    PHP:
    1. $result[0]['y'] = 0;
    2. $result[0]['x'] = date('Y-d-m H:i:s', strtotime('07:00:00'));
    3. $key = 1;
    4. foreach ($plan as $val) {
    5.     $second = $val['cycl'] * $val['plan'];
    6.     if($result[$key-1]['y'] !== 0){
    7.          $result[$key]['y'] = $val['plan'] + $result[$key-1]['y'];
    8.          $result[$key]['x'] = date('Y-d-m H:i:s', strtotime('+'.$second.' second', strtotime($result[$key-1]['x'])));
    9.     }else{
    10.          $result[$key]['y'] = (int)$val['plan'];
    11.          $result[$key]['x'] = date('Y-d-m H:i:s', strtotime('+'.$second.' second', strtotime($result[0]['x'])));
    12.    }
    13. $key ++;
    14. }
    15. return $result;
    Суть ошибки, я задаю порядок date('Y-d-m H:i:s') но проходя через цикл месяц с днем меняются местами. Например на выходе сейчас так:
    PHP:
    1. $result[0]['x']  = '2019-11-02 07:00:00';
    2. $result[1]['x']  = '2019-02-11 13:08:00';
    3. $result[2]['x']  = '2019-11-02 15:45:52';
    Подскажите пожалуйста, почему так происходит, где я ошибся?

    Если написать date('Y-m-d H:i:s') то меняются местами не будет, почему такое поведение?(
     
    #1 Artur_hopf, 11 фев 2019
    Последнее редактирование: 11 фев 2019
  2. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Записал так, ошибка осталась:
    PHP:
    1. date('Y-d-m H:i:s', strtotime($result[0]['x'].'+'.$second.' second'));
     
  3. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Дорабатываю функцию потихоньку:
    PHP:
    1. $result[0]['y'] = 0;
    2. $result[0]['x'] = date('Y-d-m H:i:s',strtotime('07:00:00'));
    3. $key = 1;
    4. $daySecond = 43200;
    5. $dayPlanSecond = 0;
    6. foreach ($plan as $val) {
    7.      $dayPlanSecond += $val['cycl'] * $val['plan'];
    8. }
    9. $dayPlanSecond = $daySecond - $dayPlanSecond;
    10. foreach ($plan as $val) {
    11.     $second = $val['cycl'] * $val['plan'];
    12.     if($result[$key-1]['y'] !== 0){
    13.          $result[$key]['y'] = $val['plan'] + $result[$key-1]['y'];
    14.          $result[$key]['x'] = date('Y-d-m H:i:s', strtotime('+'.$second.' second', strtotime($result[$key-1]['x'])));
    15.     }else{
    16.         $result[$key]['y'] = (int)$val['plan'];
    17.         $result[$key]['x'] = date('Y-d-m H:i:s', strtotime('+'.$second.' second', strtotime($result[0]['x'])));
    18.         if($dayPlanSecond > 0){
    19.             $key ++;
    20.             $result[$key]['y'] = $result[$key-1]['y'];
    21.             $result[$key]['x'] = date('Y-d-m H:i:s', strtotime('+'.$dayPlanSecond.' second', strtotime($result[$key-1]['x'])));
    22.         }
    23.     }
    24.    $key ++;
    25. }
    26. return $result;
    На выходе получаю:
    PHP:
    1. $result[0]['x']='2019-11-02 07:00:00';
    2. $result[1]['x']='2019-02-11 13:08:00';
    3. $result[2]['x']='2019-11-02 16:22:08';
    4. $result[3]['x']='2019-02-11 19:00:00';
    Почему месяца местами меняются?(
     
  4. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    какую задачу решаешь?
     
  5. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    Потому что не указали формат для strtotime. И он думает, что там стандартный Y-m-d.
     
    Artur_hopf нравится это.
  6. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @ElisDN спасибо, сейчас попробую
    --- Добавлено ---
    @TeslaFeo есть график на canvas.js. Надо туда еще одну линию запихнуть с планом на смену. До этого на flot.js было сделано. Переделываю вот, максимально убирая js код.
    --- Добавлено ---
    @ElisDN спасибо, все работает, написал так:
    PHP:
    1. $result[0]['y'] = 0;
    2. $result[0]['x'] = date('Y-d-m H:i:s',strtotime('07:00:00'));
    3. $key = 1;
    4. $daySecond = 43200;
    5. $dayPlanSecond = 0;
    6. foreach ($plan as $val) {
    7.      $dayPlanSecond += $val['cycl'] * $val['plan'];
    8. }
    9. $dayPlanSecond = $daySecond - $dayPlanSecond;
    10. foreach ($plan as $val) {
    11.     $second = $val['cycl'] * $val['plan'];
    12.        if($result[$key-1]['y'] !== 0){
    13.            $date = date('Y-d-m H:i:s', strtotime($result[$key-1]['x']));
    14.            $result[$key]['y'] = $val['plan'] + $result[$key-1]['y'];
    15.            $result[$key]['x'] = date('Y-d-m H:i:s', strtotime('+'.$second.' second', strtotime($date)));
    16.        }else{
    17.           $date = date('Y-d-m H:i:s', strtotime($result[0]['x']));
    18.           $result[$key]['y'] = (int)$val['plan'];
    19.           $result[$key]['x'] = date('Y-d-m H:i:s', strtotime('+'.$second.' second', strtotime($date)));
    20.           if($dayPlanSecond > 0){
    21.               $key ++;
    22.               $date = date('Y-d-m H:i:s', strtotime($result[$key-1]['x']));
    23.               $result[$key]['y'] = $result[$key-1]['y'];
    24.               $result[$key]['x'] = date('Y-d-m H:i:s', strtotime('+'.$dayPlanSecond.' second', strtotime($date)));
    25.           }
    26.        }
    27.      $key ++;
    28. }
    29. return $result;
    Со стороны без бутылки не разберутся конечно, но работает =)
     
  7. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    Работает не потому, что исправили, а потому, что теперь даты два раза путаются вместо одного.

    А так вообще весьма странно Y-d-m использовать вместо Y-m-d.
     
    Artur_hopf нравится это.
  8. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @ElisDN да я до исправлю, спасибо =)