$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);
Вот пример ответа на ваш вопрос с помощю 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
индексы.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть формаПередает данные методом POST В файле куда отправляются данные, такой код:
Нужно загрузить картинку на сервер но при переносе выдает ошибку
Наткнулся на код сервера, предназначение которого обеспечение ajax + long polling запросы к серверу
Чтоб при авторизации,выводился email вместо sign in, когда пользователь авторизировался