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

239
10 июня 2017, 16:25
$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=MyISAM  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);
Answer 1

Вот пример ответа на ваш вопрос с помощю php

$user_id = 57;
$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'],
];
for($i=0;$i<count($array);$i++){
    if($array[$i]['user_id'] == $user_id){
        $phone_code = $array[$i]['phone_code'];
        break;
    }
}
$user_array = [];
for($i=0;$i<count($array);$i++){
    if($array[$i]['phone_code'] == $phone_code && $array[$i]['user_id'] == $user_id && $array[$i+1]['user_id'] != $user_id){
        $user_array[$i]['date'] = $array[$i]['date'].' - '.$array[$i+1]['date'];
    }
}
print_r($user_array);

Но это не вариант, если у вас строки в таблице достигнут тысяч.

Для этого надоSQL запросом вывести только нужные строки.

Вот если тебе не составит труда создать вот такую таблицу то у тебя не будет проблем с выводом нужных строк.

CREATE TABLE `user_log` (
  `id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `prev_user_id` int(11) NOT NULL,
  `phone_code` mediumint(9) DEFAULT NULL,
  `date` datetime NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

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

И тут уже совсем простой запрос даст тебе то что нужно.

SELECT * FROM `user_log` WHERE `user_id` = 57 OR `prev_user_id` = 57;

И на последок для того что бы на больших количествах строк у тебя запрос не медлил можешь поставить на колонках user_id и prev_user_idиндексы.

READ ALSO
Защита от инъекций

Защита от инъекций

Есть формаПередает данные методом POST В файле куда отправляются данные, такой код:

272
move_uploaded_file: failed to open stream: permission denied

move_uploaded_file: failed to open stream: permission denied

Нужно загрузить картинку на сервер но при переносе выдает ошибку

269
Правильная реализация long-polling

Правильная реализация long-polling

Наткнулся на код сервера, предназначение которого обеспечение ajax + long polling запросы к серверу

263
Как заменить слова при авторизации

Как заменить слова при авторизации

Чтоб при авторизации,выводился email вместо sign in, когда пользователь авторизировался

217