Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как отфильтровать массив

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
bkmz1984
Отправлено: 18 Июля, 2016 - 15:50:37
Post Id



Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Июль 2016  
Откуда: г. Сумы, Украина


Помог: 0 раз(а)




Есть массив:

PHP:
скопировать код в буфер обмена
  1. $data[0] = array("data"=>"12.05.2016 11:00:20", "callid"=>"22", "name"=>"a");
  2. $data[1] = array("data"=>"12.05.2016 11:00:40", "callid"=>"22", "name"=>"b");
  3. $data[2] = array("data"=>"12.05.2016 11:01:02", "callid"=>"22", "name"=>"c");
  4. $data[3] = array("data"=>"12.05.2016 11:05:12", "callid"=>"33", "name"=>"d");


Как отфильтровать массив таким образом чтобы в рамках одного uid остались записи только с наименьшей датой и временем? т.е. 1-я запись и последняя

(Отредактировано автором: 19 Июля, 2016 - 15:42:36)

 
My status
 Top
andrewkard
Отправлено: 18 Июля, 2016 - 16:07:21
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




 
 Top
bkmz1984
Отправлено: 18 Июля, 2016 - 16:09:22
Post Id



Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Июль 2016  
Откуда: г. Сумы, Украина


Помог: 0 раз(а)




andrewkard пишет:
bkmz1984
http://php.net/manual/ru/function.usort.php

Отфильтровать, а не сортировать
 
My status
 Top
andrewkard
Отправлено: 18 Июля, 2016 - 18:35:48
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




bkmz1984 пишет:
Отфильтровать, а не сортировать

http://php.net/manual/ru/functio...array-filter.php
 
 Top
bkmz1984
Отправлено: 19 Июля, 2016 - 15:41:32
Post Id



Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Июль 2016  
Откуда: г. Сумы, Украина


Помог: 0 раз(а)




Товарищи кидать ссылки это не конструктивно

В общем я выношу на рассмотрение код.

PHP:
скопировать код в буфер обмена
  1. //  Массив в котором указываются все callid всех записей
  2. $all_callid = array();
  3. foreach ($data as $row) {
  4.     $all_callid[] = $row['callid'];
  5. }
  6.  
  7. // Функция для сортировки
  8. function sort_p($a, $b){
  9.     return strcmp($a["data"], $b["data"]);
  10. }
  11.  
  12. $data_end = array();
  13. // Перебираем все полученные индификаторы предварительно исключив повторяющиеся функцией array_unique()
  14. foreach (array_unique($all_callid) as $key => $value) {
  15.    
  16.     // Создаемм массивы сгруппированные по callid
  17.     $qw = array_filter($data, function ($row) use ($value) {
  18.         return ($row['callid'] == $value);
  19.     });
  20.    
  21.     // Сортируем массив по возрастанию даты используя функцию "sort_p"
  22.     uasort($qw, "sort_p");
  23.    
  24.     // Берем только первый элемент массива
  25.     $data_end[] = array_shift($qw);
  26.  
  27. }


Жду конструктивной критики

(Отредактировано автором: 19 Июля, 2016 - 15:46:23)

 
My status
 Top
andrewkard
Отправлено: 20 Июля, 2016 - 13:34:44
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




Можно так:
PHP:
скопировать код в буфер обмена
  1.  
  2. $out = array();
  3. foreach ($data as $row){
  4.     $id = $row['callid'];
  5.     if (isset($out[$id])){
  6.         $out[$id] = min($out[$id],$row['data']);
  7.     } else {
  8.         $out[$id] = $row['data'];
  9.     }
  10. }
  11.  

(Добавление)
C array_filter кода будет побольше
(Добавление)
bkmz1984 пишет:
В общем я выношу на рассмотрение код.

В общем, для array_filter нужна предварительная обработка, то лучше будет в ней и вывести то что нужно.
Данные не из БД? Если из нее, то скорее всего можно сделать средствами СУБД

(Отредактировано автором: 20 Июля, 2016 - 13:35:23)

 
 Top
bkmz1984
Отправлено: 21 Июля, 2016 - 09:51:07
Post Id



Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Июль 2016  
Откуда: г. Сумы, Украина


Помог: 0 раз(а)




andrewkard пишет:
В общем, для array_filter нужна предварительная обработка


Не совсем понял что имеется в виду?

andrewkard пишет:
Данные не из БД?


Из нее: MySQL.

andrewkard пишет:
Если из нее, то скорее всего можно сделать средствами СУБД


Это как-то с использованием подзапросов? ( OR NOT EXISTS(SELECT... или OR c.callid NOT IN (SELECT ...) ?


Нюанс по коду:

Он должен возвращать вот такие элементы:

PHP:
скопировать код в буфер обмена
  1. (
  2.     [0] => Array
  3.         (
  4.             [disposition] => ANSWERED
  5.             [callid] => 1
  6.             [agent] => a1
  7.             [data] => 2016-07-18 15:56:31
  8.         )


В вашем коде он возвращает:

(Отредактировано автором: 21 Июля, 2016 - 10:25:15)

 
My status
 Top
bkmz1984
Отправлено: 21 Июля, 2016 - 12:31:36
Post Id



Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Июль 2016  
Откуда: г. Сумы, Украина


Помог: 0 раз(а)




Немного преобразовав код получил вот такой.

PHP:
скопировать код в буфер обмена
  1. $out = array();
  2. foreach ($data_result as $row){
  3.     $id = $row['callid'];
  4.     if (isset($out[$id])){
  5.         if ($out[$id]['data'] > $row['data']){
  6.             $out[$id] = $row;
  7.         }
  8.     } else {
  9.         $out[$id] = $row;
  10.     }
  11. }


И он делает как раз то что нужно, если не брать во внимание что ключи не 0,1,2,3,4 а с пропусками 1,2,4,8.

Проверяю скорость выполнения. Ваш быстрей вроде работает.

(Отредактировано автором: 21 Июля, 2016 - 12:39:36)

 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB