За последние 24 часа нас посетили 137697 программистов и 2320 роботов. Сейчас ищут 1216 программистов ...

Правильно разбить.

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

  1. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.824
    Симпатии:
    1.333
    Адрес:
    Лень
    отстой.

    http://sandbox.onlinephpfunctions.com/code/366d381e892e01be6eb95f341b0539af115bd2f3
    --- Добавлено ---
    PHP:
    1. # если юзер не вводил дату р.
    2.  
    3. $user_info['birthday'] = null; //Пусто
    4.  
    5. $birthday = $userEdit -> formatBirtday( $user_info['birthday'] );
    PHP Notice: Undefined index: 2 in ...... on line 8
    PHP:
    1. printf( "<option%s>$day</option>", $day == $birthday['2'] ? ' selected' : '' );
    даже если Дата Р. вбита, по дистрикту типу у тебя так же будет ошибка
    PHP Notice: Undefined index: 2 in ...... on line 8

    потому что ключ с типом integer
     
  2. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    тут понял, разницы нет то-ли коротко написать то-ли через list, пишем короткую запись.
    в натуре ошибка с таким типом, не пойму а что не так, на экран она не выводится но через режим разработчика видна эта ошибка.
     
  3. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    я так полагаю в коде
    PHP:
    1. printf( "<option%s>$day</option>", $day == $birthday['2'] ? ' selected' : '' );
    где в переменных массива нет ключа.
    PHP:
    1. $birthday['2']
    2. $birthday['1']
    3. $birthday['0']
    Из-за этого ошибка, пробовал уже проверить $birthday по разному чет все ровно ругается, то ли прячет блок то ли отображает и при этом показывает ошибку.
     
    #28 _ne_scaju_, 24 авг 2019
    Последнее редактирование: 24 авг 2019
  4. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Сделал таким образом, может есть лучше решение ?
    PHP:
    1. <div class="birthday"><!-- начало блока дня рождения -->
    2.    <select name="user_day">
    3.       <option>День</option>
    4.       <?php
    5.       foreach( range(1, 31) as $day )
    6.          if( !empty($birthday['2'] ) ){
    7.             printf( "<option%s>$day</option>", $day == $birthday['2'] ? ' selected' : '');
    8.          }else{
    9.             printf( "<option>$day</option>" );
    10.          }
    11.       ?>
    12.    </select>
    13.  
    14.    <select name="user_month">
    15.       <option>Месяц</option>
    16.       <?php
    17.       $months = [
    18.            1 => 'Января', 2 => 'Февраля', 3 => 'Марта', 4 => 'Апреля',
    19.            5 => 'Мая', 6 => 'Июня',  7 => 'Июля', 8 => 'Августа',
    20.            9 => 'Сентября', 10 => 'Октября', 11 => 'Ноября', 12 => 'Декабря'
    21.        ];
    22.  
    23.       foreach($months as $key => $month)
    24.          if( !empty($birthday['1'] ) ){
    25.             printf( "<option value='".$key."' %s>$month</option>", $key == $birthday['1'] ? ' selected' : '');
    26.          }else{
    27.             printf( "<option>$month</option>");
    28.          }
    29.       ?>
    30.    </select>
    31.  
    32.    <select name="user_year">
    33.       <option>Год</option>
    34.       <?php
    35.       foreach( range( 1950, 2019 ) as $year )
    36.          if( !empty($birthday['0'] ) ){
    37.             printf( "<option%s>$year</option>", $year == $birthday['0'] ? ' selected' : '');
    38.          }else{
    39.             printf( "<option>$year</option>");
    40.          }
    41.       ?>
    42.    </select>
    43. </div> <!-- конец блока дня рождения -->
    МаусЗверь вердикт, говнокода моего?
    Можно ли его улучшить?
     
    #29 _ne_scaju_, 24 авг 2019
    Последнее редактирование: 24 авг 2019
  5. villiwalla

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

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    PHP:
    1. foreach( range(1, 31) as $day )
    Месяцы с 30 и 31 днём, февраль и високосный год.
    PHP:
    1.       $months = [
    2.            1 => 'Января', 2 => 'Февраля', 3 => 'Марта', 4 => 'Апреля',
    3.            5 => 'Мая', 6 => 'Июня',  7 => 'Июля', 8 => 'Августа',
    4.            9 => 'Сентября', 10 => 'Октября', 11 => 'Ноября', 12 => 'Декабря'
    5.        ];
    i18n, локаль

    PHP:
    1. foreach( range( 1950, 2019 ) as $year )
    В 2019 закончилась жизнь?
     
  6. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    я не знаю как сделать правильно, что бы дата отображалась правильно, если високосные дни есть в зависимости от этого вывести правильно количество дней.

    Буде новый год добавлю на один год выше.
    PHP:
    1. foreach( range( 1950, 2020) as $year )
     
    #31 _ne_scaju_, 24 авг 2019
    Последнее редактирование: 24 авг 2019
  7. villiwalla

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

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Смотри функции по работе с датой. Самому не стыдно от хардкода?
    --- Добавлено ---
    В каждой шутке есть доля правда. Делай выводы, сам же этот материал публикуешь
    Картинки...
     
  8. villiwalla

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

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    С автором ошибся
     
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    я то думал мне) да что тут поделаешь) как говорится работает это уже хорошо)
    но функцией можно поделиться которая високосные дни тоже учитывает, спасибо.
     
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.824
    Симпатии:
    1.333
    Адрес:
    Лень
    PHP:
    1. public function formatBirtday( string $string = null ): \DateTime
    2. {
    3.     return new \DateTime( null, new \DateTimeZone( 'Europe/Moscow' ) );
    4. }
    PHP:
    1. cal_days_in_month( CAL_GREGORIAN, $time -> format( 'm' ), $time -> format( 'Y' ) );
     
    _ne_scaju_ нравится это.
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    ты мне объясни эти 2 примера работают в связке?
     
  12. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.824
    Симпатии:
    1.333
    Адрес:
    Лень
    в какой связке ? ты же хочешь узнать кол-во дней с учетом февраля
    https://www.php.net/manual/ru/function.cal-days-in-month.php
    --- Добавлено ---
    у тебя вопрос поставлен так, как будто сейчас скопируешь код и якобы будет работать
     
  13. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    про функцию я прочитал что она делаешь)
    но я не понял зачем ты метод разделил, а он оказывается не разделено, просто 2 код он делает то что я просил вчера чтобы показали кол дней узнать)
     
  14. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.824
    Симпатии:
    1.333
    Адрес:
    Лень
    ...
    --- Добавлено ---
    Почему я сделал чай там, а не тут. В результате получил профит.
     
  15. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    вообще не понял о чем ты :D
    от куда переменная $time?

    Я сделал так:
    PHP:
    1. var_dump(cal_days_in_month( CAL_GREGORIAN, $birthday -> format( 'm' ), $birthday -> format( 'Y' ) ) );
    проверил действительно возвращает кол дней в месяце.
    но только не пойму а что оно мне даст, если по логике мне нужно в форму запулить от и до какого количества дней.
     
  16. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.824
    Симпатии:
    1.333
    Адрес:
    Лень
    eg.jpg
    --- Добавлено ---
    с *Ада достал
     
  17. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
  18. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    Не совсем по поводу вопроса, косвенный вопрос.
    1. Почему бы в бд полю, даты дня рождения, по умолчанию сразу не поставить null
    2. И потом проверять значение этого поля isset(), а не городить огород такой вот:
    if(!empty($user_birthday)&&!is_null($user_birthday))
     
  19. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    PHP:
    1. public function formatBirtday( string $string = null ): \DateTime
    2. {
    3.     return new \DateTime( $string, new \DateTimeZone( 'Europe/Moscow' ) );
    4. }
    --- Добавлено ---
    1. по умолчанию у меня и так стоит null
    2. а чеж не проверить на null?
    3. сейчас код изменил на маус зверя чуть выше этого коммент посмотри, только что отправил.
     
  20. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    isset() и проверят на значение и не соответствия null,
    а это зачем тогда в вашем коде выше
    1. public function formatBirtday( $user_birthday ): array
    2. {
    3. if ( !empty( $user_birthday ) && !is_null( $user_birthday ) )
    4. {
    5. return list( $d , $m , $y ) = explode( "-", $user_birthday );
    6. }
    7. return [];
    8. }
     
  21. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    1. по умолчанию у меня и так стоит null
    2. а чеж не проверить на null?
    3. сейчас код изменил на маус зверя чуть выше этого коммент посмотри, только что отправил.
    пока не зачем сейчас работаю с этим же методом но другой логикой что маус показал:
    PHP:
    1. public function formatBirtday( string $string = null ): \DateTime
    2. {
    3.     return new \DateTime( $string, new \DateTimeZone( 'Europe/Moscow' ) );
    4. }
    в данном случае я не могу сформировать список дней в форме ввода, а то-есть вывеси тот день который выбрал пользователь при редактировании.
     
  22. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.824
    Симпатии:
    1.333
    Адрес:
    Лень
    $day == $birthday -> format( 'd' )
     
    _ne_scaju_ нравится это.
  23. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    это работает для меня
    --- Добавлено ---
    решение такое:
    PHP:
    1. foreach( range( date('Y'), 1950 ) as $year )
    --- Добавлено ---
    @MouseZver
    PHP:
    1. var_dump( cal_days_in_month( CAL_GREGORIAN, $birthday -> format( 'm' ), $birthday -> format( 'Y' ) ) );
    получил количество дней для месяца
    upload_2019-8-25_11-27-38.png
    что это мне дает, объясни? как я его могу применить в куске.
    PHP:
    1. foreach( range( 1, 31 ) as $day )
    2. printf( "<option%s>$day</option>", $day == $birthday->format('d') ? ' selected' : '');
    ну получил кол. дней и дальше что с ним можно сделать? :D
     
  24. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.824
    Симпатии:
    1.333
    Адрес:
    Лень
    фантазию проявляй епт. Стыдоба на ровном месте. Офф тут.
     
    _ne_scaju_ нравится это.
  25. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Понял для чего функция епта.
    PHP:
    1. $test = cal_days_in_month( CAL_GREGORIAN, $birthday -> format( 'm' ), $birthday -> format( 'Y' ) );
    2. foreach( range( 1, $test ) as $day )
    3. printf( "<option%s>$day</option>", $day == $birthday->format('d') ? ' selected' : '');