За последние 24 часа нас посетили 30214 программистов и 1818 роботов. Сейчас ищут 767 программистов ...

Отфильтровать дату из массива

Тема в разделе "PHP для новичков", создана пользователем wet, 29 июн 2016.

Метки:
  1. wet

    wet Новичок

    С нами с:
    29 июн 2016
    Сообщения:
    14
    Симпатии:
    0
    Есть массив
    PHP:
    1.       '2016-06-21 20:00:00' => 5,
    2.       '2016-06-21 19:00:00' => 10,
    3.       '2016-06-21 16:00:00' => 1000,
    4.       '2016-06-21 13:00:00' => 7,
    5.       '2016-06-21 12:00:00' => 3,
    6.       '2016-06-20 17:00:00' => 81,
    7.       '2016-06-20 16:00:00' => 1,
    8. )
    Задача: подсчитать значения по дням с условием (если интервал менее 2х часов).
    На выходе должны получить такой массив
    PHP:
    1.       '2016-06-21' => 25,
    2.       '2016-06-20' => 82,
    3. )
     
  2. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    не правильный массив.
    --- Добавлено ---
    ты откуда такой массив берёшь сам собираешь?
     
  3. wet

    wet Новичок

    С нами с:
    29 июн 2016
    Сообщения:
    14
    Симпатии:
    0
    Массив норм, тк точно знаю что ключи не повторяются. изначально все берется из бд (множество данных), потом проходит тучу условий и только потом у нас получается такой массив.
     
  4. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Ну выбирай ключ потом парси его, ищи там свои числа. и разницу в два часа. Тока это геморой и бессмысленная трата ресурсов.
    --- Добавлено ---
    У тебя должен быть массив вида

    PHP:
    1. $array  =  [
    2.      '0' => [
    3.                'date' => '2016-06-21',
    4.                'time' => '20:00:00',
    5.                'твоё значение не знаю что оно значит' => 5
    6.       ]
    7.  
    8.       '1' => [
    9.           'date' => '2016-06-21',
    10.           'time' => '19:00:00',
    11.           'твоё значение не знаю что оно значит' => 10
    12.        ]
    13. ]
    Вот ищи аналогию.
    В таком массиве, ты можешь обойти по циклу данный массив и сверять значение тайм и день. и прибавляй там как чё хочешь, а ещё лучше всё это хранить в базе, и считать при выгрузке оттуда. Ты можешь там прокаунтить поля, и прибавить их значения, по where полям. А записывать в базу, как раз где интервал менее двух часов. Чтобы не хранить не нужные данные.
     
  5. wet

    wet Новичок

    С нами с:
    29 июн 2016
    Сообщения:
    14
    Симпатии:
    0
    Чтобы стало очевидней: я пишу аналитику персонала, т.е. в бд ничего не пишу, а только вытаскиваю и фильтрую. Вобщем почти дописал что хотел, вот только условие почему-то не проходит
    PHP:
    1. foreach ( $finalArr as $finalArrKey => $finalArrVal )
    2.         {
    3.             foreach ( $finalArrVal as $k => $v )
    4.             {
    5.                 if ( $k == 'workTime' )
    6.                 {
    7.                     foreach ( $v as $key => $val )
    8.                     {
    9.                         if ( empty($key) )
    10.                         {
    11.                             $finalArr[$finalArrKey]['totalWorkTime'][date( 'Y-m-d', strtotime($key) )] = 0;
    12.                         }  
    13.                         else
    14.                         {  
    15.                             $nextTime = strtotime( $key );
    16.                             $backTime = strtotime($finalArr[$finalArrKey]['temporaryDate']);
    17.  
    18.                             $finalArr[$finalArrKey]['interval'] = $backTime - $nextTime;
    19. echo $backTime.' - '.$nextTime.'<br>';                          
    20. echo $key.' '.$finalArr[$finalArrKey]['interval'].' < 7200<br>';                      
    21.                             // если интервал времени меньше 2х часов
    22.                             if ( ($finalArr[$finalArrKey]['interval'] > 0) && ($finalArr[$finalArrKey]['interval'] < 7200) )
    23.                             {
    24.                                 $finalArr[$finalArrKey]['totalWorkTime'][date( 'Y-m-d', strtotime($key) )] = $finalArr[$finalArrKey]['totalWorkTime'][date( 'Y-m-d', strtotime($key) )] + $val;
    25.                             }
    26.                            
    27.                             // отмечаем дату и время для сравнения в след итерации
    28.                             if ( $finalArr[$finalArrKey]['temporaryDate'] != $key )
    29.                             {
    30.                                 $finalArr[$finalArrKey]['temporaryDate'] = $key;
    31.                             }
    32.                         }  
    33.                     }
    34.                 }
    35.             }
    36.         }
     
  6. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    PHP:
    1.  $nextTime = strtotime( $key );
    2. $backTime = strtotime($finalArr[$finalArrKey]['temporaryDate']);
    покажи что в них.
     
  7. wet

    wet Новичок

    С нами с:
    29 июн 2016
    Сообщения:
    14
    Симпатии:
    0
    1466406000 - 1466402400
    --- Добавлено ---
    Вообще массив на входе такой
    PHP:
    1. $finalArr = array (
    2.   1044 =>
    3.   array (
    4.     'workTime' =>
    5.     array (
    6.         '2016-06-21 20:00:00' => 5,
    7.       '2016-06-21 19:00:00' => 10,
    8.       '2016-06-21 16:00:00' => 1000,
    9.       '2016-06-21 13:00:00' => 7,
    10.       '2016-06-21 12:00:00' => 3,
    11.       '2016-06-20 17:00:00' => 81,
    12.       '2016-06-20 16:00:00' => 1,
    13.     )
    14.   )
    15. );
     
  8. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    PHP:
    1. $finalArr[$finalArrKey]['interval'] = $backTime - $nextTime;
    Не могу понять зачем ты пытаешься обратно в массив запихнуть это ?
    Дай полностью дамп массива
     
  9. wet

    wet Новичок

    С нами с:
    29 июн 2016
    Сообщения:
    14
    Симпатии:
    0
    Это временное хранилище
    --- Добавлено ---
    это никак не влияет на обработку скрипта
     
  10. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Дай мне полностью дамп. Я посмотрю у себя. Что не так. Я так не могу въехать, что ты пишешь.
     
  11. wet

    wet Новичок

    С нами с:
    29 июн 2016
    Сообщения:
    14
    Симпатии:
    0
    Тебе дамп не нужен, все что написал выше работает без бд.
    PHP:
    1. $finalArr = array (
    2.   1044 =>
    3.   array (
    4.     'workTime' =>
    5.     array (
    6.         '2016-06-21 20:00:00' => 5,
    7.       '2016-06-21 19:00:00' => 10,
    8.       '2016-06-21 16:00:00' => 1000,
    9.       '2016-06-21 13:00:00' => 7,
    10.       '2016-06-21 12:00:00' => 3,
    11.       '2016-06-20 17:00:00' => 81,
    12.       '2016-06-20 16:00:00' => 1,
    13.     )
    14.   )
    15. );
    PHP:
    1. foreach ( $finalArr as $finalArrKey => $finalArrVal )
    2.         {
    3.             foreach ( $finalArrVal as $k => $v )
    4.             {
    5.                 if ( $k == 'workTime' )
    6.                 {
    7.                     foreach ( $v as $key => $val )
    8.                     {
    9.                         if ( empty($key) )
    10.                         {
    11.                             $finalArr[$finalArrKey]['totalWorkTime'][date( 'Y-m-d', strtotime($key) )] = 0;
    12.                         }  
    13.                         else
    14.                         {  
    15.                             $nextTime = strtotime( $key );
    16.                             $backTime = strtotime($finalArr[$finalArrKey]['temporaryDate']);
    17.  
    18.                             $finalArr[$finalArrKey]['interval'] = $backTime - $nextTime;
    19. //echo $backTime.' - '.$nextTime.'<br>';                          
    20. //echo $key.' '.$finalArr[$finalArrKey]['interval'].' < 7200<br>';                      
    21.                             // если интервал времени меньше 2х часов
    22.                             if ( ($finalArr[$finalArrKey]['interval'] > 0) && ($finalArr[$finalArrKey]['interval'] < 7200) )
    23.                             {
    24.                                
    25.                                 if ( !$finalArr[$finalArrKey]['totalWorkTime'][date( 'Y-m-d', strtotime($key) )] )
    26.                                 {    echo '<b>'.$val.'</b><br>';
    27.                                     $finalArr[$finalArrKey]['totalWorkTime'][date( 'Y-m-d', strtotime($key) )] = $val;
    28.                                 }  
    29.                                 else
    30.                                 { echo $finalArr[$finalArrKey]['temporaryDate'][date( 'Y-m-d', strtotime($key) )].' + '.$val.'<br>';
    31.                                     $finalArr[$finalArrKey]['totalWorkTime'][date( 'Y-m-d', strtotime($key) )] = $finalArr[$finalArrKey]['temporaryDate'] + $val;
    32.                                     //$finalArr[$finalArrKey]['totalWorkTime'][$key] = app::secToTime($val);
    33.                                 }  
    34.                             }
    35.                            
    36.                             // отмечаем дату и время для сравнения в след итерации
    37.                             if ( $finalArr[$finalArrKey]['temporaryDate'] != $key )
    38.                             {
    39.                                 $finalArr[$finalArrKey]['temporaryDate'] = $key;
    40.                             }
    41.                         }  
    42.                     }
    43.                 }
    44.             }
    45.         }
     
  12. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    ну не хочешь давать дамп массива, решай свой вопрос сам. Твой код с этим массивом не работает. конкретно отсутствуют ключи в массивах. Если ты пытаешься воспроизвести свой код вот с тем массивом, который ты кидаешь сюда, то у тебя не чё не получится там ошибок куча.

    У тебя вообще дебаг php включен ? ты смотришь что ты пишешь ?
     
  13. wet

    wet Новичок

    С нами с:
    29 июн 2016
    Сообщения:
    14
    Симпатии:
    0
    У меня все отлично срабатывает без ошибок. Мож ты не все скопипастил?
     
  14. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    PHP:
    1. //исходные данные
    2. $arr = array(
    3.     '2016-06-21 20:00:00' => 5,
    4.     '2016-06-21 19:00:00' => 10,
    5.     '2016-06-21 16:00:00' => 1000,
    6.     '2016-06-21 13:00:00' => 7,
    7.     '2016-06-21 12:00:00' => 3,
    8.     '2016-06-20 17:00:00' => 81,
    9.     '2016-06-20 16:00:00' => 1,
    10. );
    11. $newArr = array(); //будут храниться новые данные
    12. foreach ($arr as $key => $val) {
    13.     $first = new DateTime($key);
    14.     next($arr);
    15.     list($key1, $val1) = each($arr);
    16.     prev($arr);
    17.     $second = new DateTime($key1);
    18.     $difference = $first->diff($second);
    19.     if ($difference->format('%h') < 2) {
    20.         $word = strstr($key, ' ', TRUE);
    21.         if (isset($newArr[$word])) {
    22.             $newArr[$word] = $newArr[$word] + $val + $val1;
    23.         } else {
    24.             $newArr[$word] = $val + $val1;
    25.         }
    26.     }
    27. }
     
  15. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Отлично говоришь работает я чёто вот просто не вижу у тебя ключа такого в массиве ['totalWorkTime']
     
  16. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Возможно подойдет.
     
  17. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    не знаю... А ты понял что он хочет сделать ? То что он хочет сделать вообще так не делается он хочет высчитать, а высчитывают формулы. А не куча алгоритмов. У него есть интервал два часа.
    --- Добавлено ---
    вообще не понимаю что ты написал, и что чувак выше написал. Вы бы комментировали что вы делаете. И мысли свои. Не влуплю просто, задачу он сказал, но таким образом её решать бред(ну мне так кажется), а данных для решения тоже маловато. Если данные берутся из бд то там на уровне бд можно отсеять не нужные данные. и выбрать те которые надо. а формуло по которой будет выбирать можно до выборки написать, и потом по где отсеивать.
     
  18. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @askanim, не к тебе обращался :)
    --- Добавлено ---
    я тоже не понимаю тебя :)
     
  19. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @mahmuzar А я просто сторонний чувак пытающийся понять.
     
  20. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @askanim, ну так вникай.
     
  21. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Вот она задача. У него есть массив с конкретным указателем часа. При чём время как понимаю идёт друг за другом. так вот нам нужно, считать значения ключей поподающих под интервал времени.

    Значит что нужно сделать найти ключи которые поподают под интервал времени, откуда идёт точка отсчёта первое? Чтобы понять интервал, ибо у нас все просто будут поподать. Представим это всё дело на прямой, а эти ключи словно точки на ней лежащие, прямая может быть бесконечной. Но точка отсчёта должна быть, если нет надо её установить. И считать от неё, у прямой есть один большой диапазон который будет 24 к примеру одни сутки что значит, в нём под диапазоны, по 2 часа. Откуда идёт точка отсчёта ?
     
  22. wet

    wet Новичок

    С нами с:
    29 июн 2016
    Сообщения:
    14
    Симпатии:
    0
    Выводит пустой массив
     
  23. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Как я понял, он хочет суммировать значения тех дат, между которыми интервал составляет менее двух часов.
    --- Добавлено ---
    Он ничего не возвращает в принципе. Покажи как сделал ты.
    --- Добавлено ---
    @wet, у меня вроде все норм.
    вывод:
    Код (Text):
    1. array(2) {
    2.   ["2016-06-21"]=>
    3.   int(25)
    4.   ["2016-06-20"]=>
    5.   int(82)
    6. }
     
  24. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Я вообще хотел его привести к тому, то что он написал, не работает. Там ошибки.
     
  25. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @askanim, возможно в его коде ошибки, не смотрел. Он дал исходные данные, и какой результат требуется, попробовал сделать.
    --- Добавлено ---
    В коде ковыряться - лень.