08
Июн
2017

Выбрать периоды из массива

$array = [
    ['user_id' => 57, 'phone_code' => 104, 'date' => '2017-06-07 07:49:52'],
    ['user_id' => 43, 'phone_code' => 104, 'date' => '2017-06-07 08:57:41'],
    ['user_id' => 72, 'phone_code' => 104, 'date' => '2017-06-07 09:49:38'],
    ['user_id' => 57, 'phone_code' => 104, 'date' => '2017-06-07 11:08:34'],
    ['user_id' => 25, 'phone_code' => 104, 'date' => '2017-06-07 12:49:38'],
];

Нужно получить интервалы заходов юзера 57, а он считается от его первого входа, до авторизации другого юзера. Судя по массиву он входил 2 раза: с 7:49 по 8:57 и с 11:08 по 12:49

Как сделать красиво ? C учетом того что данных очень много)

SQL:


CREATE TABLE IF NOT EXISTS `user_log` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `phone_code` mediumint(9) DEFAULT NULL,
  `date` datetime NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1889 ;

INSERT INTO `user_log` (`id`, `user_id`, `phone_code`, `date`) VALUES
(1853, 57, 104, '2017-06-07 07:49:52'),
(1863, 43, 104, '2017-06-07 08:57:41'),
(1866, 72, 104, '2017-06-07 09:49:38'),
(1867, 57, 104, '2017-06-07 11:08:34'),
(1868, 25, 104, '2017-06-07 12:49:38');

Мое решение:

$user_id = 57;
$phone_code = 104;

$temp = [];

for($i=0; $i<=count($array); $i++){

    if($user_id == $array[$i]['user_id']){

       $temp[]=$i;    
       $start[] = $array[$i]['date'];
    }
}

foreach($temp as $k){

    if(!empty($array[$k+1]['user_id'])){
        if($array[$k+1]['user_id'] !=$user_id)
            $period[] = $array[$k+1]['date'];
    }
}
print_r($start);
print_r($period);

Источник: https://ru.stackoverflow.com/questions/677040/%D0%92%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C-%D0%BF%D0%B5%D1%80%D0%B8%D0%BE%D0%B4%D1%8B-%D0%B8%D0%B7-%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0

Share

Тебе может это понравится...