За последние 24 часа нас посетили 22852 программиста и 1665 роботов. Сейчас ищут 1539 программистов ...

DateInterval

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

  1. Golovorot

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

    С нами с:
    24 окт 2012
    Сообщения:
    53
    Симпатии:
    0
    Совершенно глупый вопрос, но я уже устал искать решение. Как занести $d2 в массив по типу $d1?
    PHP:
    1. foreach ($arr_record as $key1 => $record) {
    2.             if($record->record_washclass == 2){
    3.                 $d1 = new DateTime("2015-01-01 $key");
    4.                 $d2 = new DateTime("2015-01-01 $key");
    5.                 $newKey = $key;
    6.                 try {
    7.                     $diff30Min = new DateInterval('PT30M');
    8.                     $diff60Min = new DateInterval('PT60M');
    9.                     $d1->add($diff30Min);
    10.                     $d2->add($diff60Min);
    11.                     $newKey = $d1->format('H:i:s');
    12.  
    13.                 }catch(Exception $e){
    14.                     echo $e->getMessage();
    15.                 }
    16.                 $arr_records[$newKey][$key1] = $record;
    17.             }
    18.         }
    19.     }
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    А не могли бы вы психонуть и сформулировать так, чтобы это было еще и понятно? Показать, что ли массив, который должен быть в результате, описать суть того, что происходит в вашем коде и т.д.
    --- Добавлено ---
    P.S. Чтобы потом лишний раз не спрашивать - откуда у вас берется переменная $key? Не $key1, а именно $key.
     
  3. Golovorot

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

    С нами с:
    24 окт 2012
    Сообщения:
    53
    Симпатии:
    0
    PHP:
    1. foreach ($arr_records as $key => $arr_record) {
    2.         foreach ($arr_record as $key1 => $record) {
    3.             if($record->record_washclass == 2){
    4.                 $d1 = new DateTime("2015-01-01 $key");
    5.                 $d2 = new DateTime("2015-01-01 $key");
    6.                 $newKey = $key;
    7.                 try {
    8.                     $diff30Min = new DateInterval('PT30M');
    9.                     $diff60Min = new DateInterval('PT60M');
    10.                     $d1->add($diff30Min);
    11.                     $d2->add($diff60Min);
    12.                     $newKey = $d1->format('H:i:s');
    13.  
    14.                 }catch(Exception $e){
    15.                     echo $e->getMessage();
    16.                 }
    17.                 $arr_records[$newKey][$key1] = $record;
    18.             }
    19.         }
    20.     }
    Прошу прощения, строчку кода пропустил.
    Нужно, чтобы в массив $arr_record записывалось два интервала: 30 и 60 минут. В настоящий момент записывается только в 30 минут.
     
  4. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    @Golovorot, С уточнениями как-то не сложилось, тогда хоть исходный массив покажите.
     
  5. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Короче, предположу, что в $arr_records у вас массив объектов. Что-то в этом роде:
    PHP:
    1.   '05:12:05' =>
    2.   array (
    3.     0 =>
    4.     stdClass::__set_state(array(
    5.        'record_washclass' => 2,
    6.     )),
    7.   ),
    8.   '15:15:15' =>
    9.   array (
    10.     0 =>
    11.     stdClass::__set_state(array(
    12.        'record_washclass' => 1,
    13.     )),
    14.   ),
    15.   '23:59:59' =>
    16.   array (
    17.     0 =>
    18.     stdClass::__set_state(array(
    19.        'record_washclass' => 2,
    20.     )),
    21.   ),
    22. )
    И допустим, что я понял вашу задачу:
    PHP:
    1. foreach ($arr_records as $key => $arr_record) {
    2.     foreach ($arr_record as $key1 => $record) {
    3.         if($record->record_washclass == 2){
    4.             $d1 = new \DateTimeImmutable("2015-01-01 $key");
    5.             $key30Min = $d1->add(new \DateInterval('PT30M'))->format('H:i:s');
    6.             $key60Min = $d1->add(new \DateInterval('PT60M'))->format('H:i:s');
    7.             $arr_records[$key30Min][$key1] = $record;
    8.             $arr_records[$key60Min][$key1] = $record;
    9.         }
    10.     }
    11. }
    Тогда на выходе у вас будет такой результат:
    PHP:
    1.   '05:12:05' =>
    2.   array (
    3.     0 =>
    4.     stdClass::__set_state(array(
    5.        'record_washclass' => 2,
    6.     )),
    7.   ),
    8.   '15:15:15' =>
    9.   array (
    10.     0 =>
    11.     stdClass::__set_state(array(
    12.        'record_washclass' => 1,
    13.     )),
    14.   ),
    15.   '23:59:59' =>
    16.   array (
    17.     0 =>
    18.     stdClass::__set_state(array(
    19.        'record_washclass' => 2,
    20.     )),
    21.   ),
    22.   '05:42:05' =>
    23.   array (
    24.     0 =>
    25.     stdClass::__set_state(array(
    26.        'record_washclass' => 2,
    27.     )),
    28.   ),
    29.   '06:12:05' =>
    30.   array (
    31.     0 =>
    32.     stdClass::__set_state(array(
    33.        'record_washclass' => 2,
    34.     )),
    35.   ),
    36.   '00:29:59' =>
    37.   array (
    38.     0 =>
    39.     stdClass::__set_state(array(
    40.        'record_washclass' => 2,
    41.     )),
    42.   ),
    43.   '00:59:59' =>
    44.   array (
    45.     0 =>
    46.     stdClass::__set_state(array(
    47.        'record_washclass' => 2,
    48.     )),
    49.   ),
    50. )
     
    Golovorot нравится это.
  6. Golovorot

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

    С нами с:
    24 окт 2012
    Сообщения:
    53
    Симпатии:
    0
    Код (Text):
    1. [16:30:00] => Array
    2.         (
    3.             [4752] => Record Object
    4.                 (
    5.                     [record_id] => 73933
    6.                     [record_user_id] => 29328
    7.                     [record_org_id] => 1795
    8.                     [record_block_id] => 4752
    9.                     [record_date] => 2018-02-21
    10.                     [record_time] => 16:00:00
    11.                     [record_tz] => 10
    12.                     [record_sdate] => 2018-02-21
    13.                     [record_stime] => 16:00:00
    14.                     [record_car_id] => 5749
    15.                     [record_carText] => CR-V
    16.                     [record_isCompleted] => 1
    17.                     [record_isConfirmed] => 1
    18.                     [record_isCanceled_by_admin] => 0
    19.                     [record_isCanceled_by_user] => 0
    20.                     [record_isNotCompleted] => 0
    21.                     [record_created_by_admin] => 0
    22.                     [record_name] => 1519169400 1519214102 1519198200 25200
    23.                     [record_washclass] => 2
    24.                     [record_isFree] => 0
    25.                     [record_comments] =>
    26.                     [record_change_time] => 0
    27.                     [record_isbusy] => 0
    28.                 )
    29.  
    30.         )
    вот примерный ответ. А за счет добавления интервала должен появиться тот же массив, только в самой первой строчке вместо [16:30:00] => Array должно быть [17:00:00] => Array. Если объяснять непрофессиональным языком
     
  7. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Надеюсь, что вы понимаете, что при совпадении ключей, каждый последующий будет перезаписывать предыдущее его значение.
     
  8. Golovorot

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

    С нами с:
    24 окт 2012
    Сообщения:
    53
    Симпатии:
    0
    Само собой. Соответственно, нужна не перезапись, а добавление нового массива с новым интервалом
     
  9. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    @Golovorot, код я вам показал выше. Если не так, то опять же повторю то, с чего начал - покажите желаемый результат.
     
  10. Golovorot

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

    С нами с:
    24 окт 2012
    Сообщения:
    53
    Симпатии:
    0
    А, решение не заметил)
    То есть двумя различными ключам вариант. Понял.
    Я подумываю над записью туда массива, чтобы легче дальше править было
     
  11. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Вам видней, т.к. суть происходящего для меня осталась загадкой.
     
    alexblack нравится это.
  12. Golovorot

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

    С нами с:
    24 окт 2012
    Сообщения:
    53
    Симпатии:
    0
    имеется массив с информацией. Ключ в этом массиве - время, для примера возьмем : [12:00:00]. В случае, если washclass == 2, нам надо продублировать массив с ключом [12:00:00], но ключ поменять на [12:30:00]. Т.е прибавить 30 минут. В случае, который я пытаюсь здесь описать, помимо прибавленных 30 минут, нужно прибавить еще 30 минут сверху, чтобы был третий схожий массив, который отличался только лишь временем, в данном случае это - [13:00:00]
     
  13. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    @Golovorot, про это я догадался. Другой вопрос - для каких целей этот массив будет использоваться в дальнейшем. И больше всего меня смущает то, что дублирование ключей, о чем я говорил выше, тут совсем не маловероятная ситуация, тем более, если объем данных не маленький. Объясню на упрощенном примере. Есть массив:
    PHP:
    1. <?php
    2. $arr = [
    3.     5 => [
    4.         'val' => 'Val 5',
    5.         'flag' => 2,
    6.     ],
    7.     7 => [
    8.         'val' => 'Val 7',
    9.         'flag' => 1,
    10.     ],
    11.     8 => [
    12.         'val' => 'Val 8',
    13.         'flag' => 2
    14.     ],
    15.     10 => [
    16.         'val' => 'Val 10',
    17.         'flag' => 1
    18.     ],
    19. ];
    Если flag == 2, то добавляем новый элемент с ключом == текущий ключ + 2:
    PHP:
    1. <?php
    2. foreach($arr as $key => $item) {
    3.     if($item['flag'] == 2) {
    4.         $arr[$key + 2] = $item;
    5.     }
    6. }
    На выходе получаем такой результат
    PHP:
    1. (
    2.     [5] => Array
    3.         (
    4.             [val] => Val 5
    5.             [flag] => 2
    6.         )
    7.  
    8.     [7] => Array
    9.         (
    10.             [val] => Val 5
    11.             [flag] => 2
    12.         )
    13.  
    14.     [8] => Array
    15.         (
    16.             [val] => Val 8
    17.             [flag] => 2
    18.         )
    19.  
    20.     [10] => Array
    21.         (
    22.             [val] => Val 8
    23.             [flag] => 2
    24.         )
    25.  
    26. )
    Как видите, у второго элемента теперь данные из первого, а у четвертого - из третьего. Так же может произойти и у вас, когда добавляя 30/60 минут, окажется, что ключ с таким временем уже существует.
     
  14. Golovorot

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

    С нами с:
    24 окт 2012
    Сообщения:
    53
    Симпатии:
    0
    Нет, такого не повторится, тк потом идет проверка на еще один параметр.
    [​IMG]Используется дальше этот массив чисто для визуального отображения. Тут washclass == 2, занимаются сразу 2 ячейки
    [​IMG]