Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.08.2013, 21:35   #1
skillful
Новичок
Джуниор
 
Регистрация: 31.08.2013
Сообщений: 9
По умолчанию Переделка массива

Есть вот такой вот массив

PHP код:
Array
(
    [
0] => Array
        (
            [
id] => 1960
            
[sender_id] => 2
            
[receiver_id] => 12
            
[date] => 1377720574
            
[read_at] => 0
            
[body] => пара
            
[status] => noread
            
[folder] => outbox
            
[email] => 0
            
[params] => 
            [
uid] => 2
        
)

    [
1] => Array
        (
            [
id] => 1958
            
[sender_id] => 2
            
[receiver_id] => 12
            
[date] => 1377720547
            
[read_at] => 0
            
[body] => кепуе
            
[status] => noread
            
[folder] => outbox
            
[email] => 0
            
[params] => 
            [
uid] => 2
        
)

    [
2] => Array
        (
            [
id] => 1956
            
[sender_id] => 13
            
[receiver_id] => 2
            
[date] => 1377720481
            
[read_at] => 0
            
[body] => ваыва
            
[status] => read
            
[folder] => outbox
            
[email] => 0
            
[params] => 
            [
uid] => 13
        
)

    [
3] => Array
        (
            [
id] => 1954
            
[sender_id] => 13
            
[receiver_id] => 2
            
[date] => 1377720465
            
[read_at] => 0
            
[body] => павпа
            
[status] => read
            
[folder] => outbox
            
[email] => 0
            
[params] => 
            [
uid] => 13
        
)

    [
4] => Array
        (
            [
id] => 1952
            
[sender_id] => 13
            
[receiver_id] => 2
            
[date] => 1377718346
            
[read_at] => 0
            
[body] => оьрроь
            
[status] => read
            
[folder] => outbox
            
[email] => 0
            
[params] => 
            [
uid] => 13
        
)

    [
5] => Array
        (
            [
id] => 1950
            
[sender_id] => 2
            
[receiver_id] => 13
            
[date] => 1377717724
            
[read_at] => 0
            
[body] => sad
            
[status] => read
            
[folder] => outbox
            
[email] => 0
            
[params] => 
            [
uid] => 2
        
)

Где:
receiver_id - это отправитель сообщения

Нужно как-то сформировать другой массив из всех отправителей..
При чем, что-бы этот массив срабатывал тогда когда date последнего сообщения была меньше текущего времени на 900 сек.

Оплачу код в пределах разумного по карте Visa
skillful вне форума Ответить с цитированием
Старый 31.08.2013, 21:41   #2
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

массив можно сформировать... но ваше высказывание - насчет что массив срабатывал... вообще не понятно
может имеется ввиду, чтоб при формировании использовал лишь те элементы - для которых выполняется ваше условие? - если да - то могу помочь
ADSoft вне форума Ответить с цитированием
Старый 31.08.2013, 22:03   #3
skillful
Новичок
Джуниор
 
Регистрация: 31.08.2013
Сообщений: 9
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
массив можно сформировать... но ваше высказывание - насчет что массив срабатывал... вообще не понятно
может имеется ввиду, чтоб при формировании использовал лишь те элементы - для которых выполняется ваше условие? - если да - то могу помочь
А вот. Примерно объясню какой должен получится массив.
Из верхнего массива должны получится массивы по receiver_id
[receiver_id] => Array //уникальный id
(
[date] => 1377720481 //при чем сдесь дата последнего сообщения
[sum] => $sum // кол-во слагаемых массивов receiver_id
)

Последний раз редактировалось skillful; 31.08.2013 в 22:14.
skillful вне форума Ответить с цитированием
Старый 31.08.2013, 22:46   #4
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Подозреваю, что возня с массивом здесь не при чем – и всё можно решить одним правильным запросом к БД, ну в крайнем случае – парой запросов.
Запости здесь структуру таблицы, и краткий дамп данных из неё – это увеличит шансы на помощь.
Andkorol вне форума Ответить с цитированием
Старый 31.08.2013, 23:02   #5
skillful
Новичок
Джуниор
 
Регистрация: 31.08.2013
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Подозреваю, что возня с массивом здесь не при чем – и всё можно решить одним правильным запросом к БД, ну в крайнем случае – парой запросов.
Запости здесь структуру таблицы, и краткий дамп данных из неё – это увеличит шансы на помощь.
Структура полного варианта:
Цитата:
CREATE TABLE IF NOT EXISTS `pm` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`sender_id` int(10) DEFAULT NULL,
`receiver_id` int(10) NOT NULL,
`date` int(10) unsigned NOT NULL,
`read_at` int(10) unsigned NOT NULL,
`body` text NOT NULL,
`status` varchar(9) NOT NULL,
`folder` varchar(10) NOT NULL,
`email` int(1) NOT NULL,
`params` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `sender_id` (`sender_id`),
KEY `receiver_id` (`receiver_id`),
KEY `status` (`status`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Дамп:
Цитата:
--
-- Дамп данных таблицы `pm`
--

INSERT INTO `pm` (`id`, `sender_id`, `receiver_id`, `date`, `read_at`, `body`, `status`, `folder`, `email`, `params`) VALUES
(1935, 2, 10, 1377717461, 0, 'вамвам', 'read', 'inbox', 0, ''),
(1934, 10, 2, 1377717458, 0, 'вамвамвам', 'noread', 'outbox', 0, ''),
(1933, 2, 10, 1377717458, 0, 'вамвамвам', 'read', 'inbox', 0, ''),
(1936, 10, 2, 1377717461, 0, 'вамвам', 'noread', 'outbox', 0, ''),
(1937, 2, 12, 1377717680, 0, 'фывфыв', 'read', 'inbox', 0, ''),
(1938, 12, 2, 1377717680, 0, 'фывфыв', 'read', 'outbox', 0, ''),
(1939, 2, 12, 1377717682, 0, 'ывфыв', 'read', 'inbox', 0, ''),
(1940, 12, 2, 1377717682, 0, 'ывфыв', 'read', 'outbox', 0, ''),
(1941, 12, 2, 1377717693, 0, 'фывфыв', 'read', 'inbox', 0, ''),
(1942, 2, 12, 1377717693, 0, 'фывфыв', 'read', 'outbox', 0, ''),
(1943, 12, 2, 1377717694, 0, 'ыфвыфв', 'read', 'inbox', 0, ''),
(1944, 2, 12, 1377717694, 0, 'ыфвыфв', 'read', 'outbox', 0, ''),
(1945, 13, 2, 1377717722, 0, 'sadasdsa', 'read', 'inbox', 0, ''),
(1946, 2, 13, 1377717722, 0, 'sadasdsa', 'read', 'outbox', 0, ''),
(1947, 13, 2, 1377717723, 0, 'sadsad', 'read', 'inbox', 0, ''),
(1948, 2, 13, 1377717723, 0, 'sadsad', 'read', 'outbox', 0, ''),
(1949, 13, 2, 1377717724, 0, 'sad', 'read', 'inbox', 0, ''),
(1950, 2, 13, 1377717724, 0, 'sad', 'read', 'outbox', 0, ''),
(1951, 2, 13, 1377718346, 0, 'оьрроь', 'read', 'inbox', 0, ''),
(1952, 13, 2, 1377718346, 0, 'оьрроь', 'read', 'outbox', 0, ''),
(1953, 2, 13, 1377720465, 0, 'павпа', 'read', 'inbox', 0, ''),
(1954, 13, 2, 1377720465, 0, 'павпа', 'read', 'outbox', 0, ''),
(1955, 2, 13, 1377720481, 0, 'ваыва', 'read', 'inbox', 0, ''),
(1956, 13, 2, 1377720481, 0, 'ваыва', 'read', 'outbox', 0, ''),
(1957, 12, 2, 1377720547, 0, 'кепуе', 'read', 'inbox', 0, ''),
(1958, 2, 12, 1377720547, 0, 'кепуе', 'noread', 'outbox', 0, ''),
(1959, 12, 2, 1377720574, 0, 'пара', 'read', 'inbox', 0, ''),
(1960, 2, 12, 1377720574, 0, 'пара', 'noread', 'outbox', 0, '');
Запрос такой:
'WHERE' => 'folder="outbox" AND p.email=0'

Этот запрос выполняется каждый раз при загрузке любой страницы. В данном запросе нужно отправить сообщение на емаил пользователю у которого есть новые сообщения (но последнее сообщение (ID) к нему было 15 мин. назад).

Я даже не представляю как это сделать одним запросом....

Последний раз редактировалось skillful; 31.08.2013 в 23:06.
skillful вне форума Ответить с цитированием
Старый 01.09.2013, 00:06   #6
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Примерно так – если я правильно понял критерии выборки:
PHP код:
mysqlSELECT `p`.`receiver_id`, MAX(`p`.`date`) AS `date`, 
    -> (
SELECT COUNT(`p1`.`id`) 
    -> 
FROM `pm` AS `p1
    -> 
WHERE `p1`.`receiver_id` = `p`.`receiver_id
    -> 
AND `p1`.`date` < (UNIX_TIMESTAMP() - 900
    -> 
AND `p1`.`folder` = 'outbox' 
    
-> AND `p1`.`email` = 0) AS `sum
    -> 
FROM `pm` AS `p
    -> 
WHERE `p`.`date` < (UNIX_TIMESTAMP() - 900
    -> 
AND `p`.`folder` = 'outbox' 
    
-> AND `p`.`email` = 0
    
-> GROUP BY `p`.`receiver_id`;
+-------------+------------+------+
receiver_id date       sum  |
+-------------+------------+------+
|           
1377720481 |    |
|          
12 1377720574 |    |
|          
13 1377717724 |    |
+-------------+------------+------+
3 rows in set (0.00 sec
Andkorol вне форума Ответить с цитированием
Старый 01.09.2013, 00:10   #7
skillful
Новичок
Джуниор
 
Регистрация: 31.08.2013
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Примерно так – если я правильно понял критерии выборки:
PHP код:
mysqlSELECT `p`.`receiver_id`, MAX(`p`.`date`) AS `date`, 
    -> (
SELECT COUNT(`p1`.`id`) 
    -> 
FROM `pm` AS `p1
    -> 
WHERE `p1`.`receiver_id` = `p`.`receiver_id
    -> 
AND `p1`.`date` < (UNIX_TIMESTAMP() - 900
    -> 
AND `p1`.`folder` = 'outbox' 
    
-> AND `p1`.`email` = 0) AS `sum
    -> 
FROM `pm` AS `p
    -> 
WHERE `p`.`date` < (UNIX_TIMESTAMP() - 900
    -> 
AND `p`.`folder` = 'outbox' 
    
-> AND `p`.`email` = 0
    
-> GROUP BY `p`.`receiver_id`;
+-------------+------------+------+
receiver_id date       sum  |
+-------------+------------+------+
|           
1377720481 |    |
|          
12 1377720574 |    |
|          
13 1377717724 |    |
+-------------+------------+------+
3 rows in set (0.00 sec
Спасибо. Ваш код опробую завтра...
skillful вне форума Ответить с цитированием
Старый 01.09.2013, 09:32   #8
TranceSmile
Смайлик :)
Форумчанин
 
Аватар для TranceSmile
 
Регистрация: 12.12.2010
Сообщений: 445
По умолчанию

А почему не отправить письмо на емаил пользователю сразу после создания сообщения?
Самый перспективный framework Yii (c)
TranceSmile вне форума Ответить с цитированием
Старый 01.09.2013, 17:29   #9
skillful
Новичок
Джуниор
 
Регистрация: 31.08.2013
Сообщений: 9
По умолчанию

Цитата:
Сообщение от TranceSmile Посмотреть сообщение
А почему не отправить письмо на емаил пользователю сразу после создания сообщения?
Потому-что сообщения сделаны в виде диалогов. Пользователь может отправить сообщений 5 в течении 10 секунд. Пять же писем не отправишь на почту, во первых засоряет ящик, во вторых увиличивает нагрузку на сервер.

Приведу пример: Один пользователь быстро отправил 3 сообщения другому пользователю. Они получили флаг p.email=0 т.е. получатель еще не уведомлен об этих сообщениях. Более отправитель ничего не писал тому пользователю. И по истечении 15 минут (если нет больше новых сообщений от отправителя) нужно отправить письмо получателю о новых сообщениях (в кол-ве 3-х штук). После отправки письма нужно изменить на p.email=1. Т. е. о том, что пользователь уведомлен о новых письмах. Для этого нужно знать их id, а соответственно делать запрос ко всем сообщениям с p.email=0.

И как я понял в запросе не нужно указывать `p1`.`date` < (UNIX_TIMESTAMP() - 900), потому-что он не охватывает только, что написанные сообщения (новые), а если они есть то отправлять письмо уже не нужно. 900 секунд уже нодо указывать в php коде в частности в массивах. Поэтому проблема остается открытой. Жду помощи.
skillful вне форума Ответить с цитированием
Старый 01.09.2013, 19:16   #10
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от skillful Посмотреть сообщение
Приведу пример: Один пользователь быстро отправил 3 сообщения другому пользователю. Они получили флаг p.email=0 т.е. получатель еще не уведомлен об этих сообщениях. Более отправитель ничего не писал тому пользователю. И по истечении 15 минут (если нет больше новых сообщений от отправителя) нужно отправить письмо получателю о новых сообщениях (в кол-ве 3-х штук).
Логика кривая какая-то...
Если один пользователь начнет отправлять сообщения другому пользователю – допустим, по одному сообщению каждые 10-13 минут (т.е. в промежутках менее оговоренных 15 минут) – то по этой логике email получателю о новых сообщениях не будет отправлен никогда, точнее уведомление по email будет отправлено фиг знает когда (собственно, когда отправитель перестанет отправлять ему новые сообщения – а это может наступить и не скоро).
Какой тогда толк от такой системы оповещения?

Пользователь должен быть своевременно оповещен о новых сообщениях – независимо от того, окончен ли обмен сообщениями, или же общение активно продолжается.

Последний раз редактировалось Andkorol; 01.09.2013 в 19:39.
Andkorol вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переделка линукса snakes Компьютерное железо 10 28.05.2013 18:10
переделка ПО modob1 Софт 0 20.02.2012 19:03
Переделка Flammed Visual C++ 0 14.05.2011 13:16
Переделка шаблонов ! ! ! Fanat31 WordPress и другие CMS 2 22.01.2011 12:42
Переделка кода hen Общие вопросы C/C++ 6 24.10.2009 17:58