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]   

> Описание: Подскажите как оптимально сделать выборку из многомерного массива по определенным критериям
Странник
Отправлено: 15 Июня, 2016 - 11:16:06
Post Id



Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Апр. 2010  


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




Есть следующий массив:

PHP:
скопировать код в буфер обмена
  1.  
  2. (
  3.     [0] => Array
  4.         (
  5.             [0] => 12
  6.             [1] => Петя
  7.         )
  8.  
  9.     [1] => Array
  10.         (
  11.             [0] => 3
  12.             [1] => Сергей
  13.         )
  14.  
  15.     [2] => Array
  16.         (
  17.             [0] => 33
  18.             [1] => Оксана
  19.         )
  20.     [3] => Array
  21.         (
  22.             [0] => 3
  23.             [1] => Петя
  24.         )
  25.  
  26.     [4] => Array
  27.         (
  28.             [0] => 10
  29.             [1] => Сергей
  30.         )
  31.  
  32.     [5] => Array
  33.         (
  34.             [0] => 52
  35.             [1] => Петя
  36.         )
  37.     [6] => Array
  38.         (
  39.             [0] => 17
  40.             [1] => Люда
  41.         )
  42.  
  43.     [7] => Array
  44.         (
  45.             [0] => 24
  46.             [1] => Сергей
  47.         )
  48.  
  49.     [8] => Array
  50.         (
  51.             [0] => 8
  52.             [1] => Надя
  53.         )
  54.  
  55. )
  56.  


Как вы видите, имена повторяются, но второй элемент массива (цифра - возраст) с повторяющимися именами всегда разный.
Подскажите как удалить из массива ненужные элементы, так, чтоб имена не повторялись, а из тех что повторялись, осталось Имя с максимальным возрастом. Примерно так:

PHP:
скопировать код в буфер обмена
  1. (
  2.  
  3.     [2] => Array
  4.         (
  5.             [0] => 33
  6.             [1] => Оксана
  7.         )
  8.     [5] => Array
  9.         (
  10.             [0] => 52
  11.             [1] => Петя
  12.         )
  13.     [6] => Array
  14.         (
  15.             [0] => 17
  16.             [1] => Люда
  17.         )
  18.  
  19.     [7] => Array
  20.         (
  21.             [0] => 24
  22.             [1] => Сергей
  23.         )
  24.  
  25.     [8] => Array
  26.         (
  27.             [0] => 8
  28.             [1] => Надя
  29.         )
  30.  
  31. )
 
 Top
Строитель Модератор
Отправлено: 15 Июня, 2016 - 14:28:13
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




Странник пишет:
Подскажите как удалить из массива ненужные элементы, так, чтоб имена не повторялись, а из тех что повторялись, осталось Имя с максимальным возрастом
У меня варианта покороче не получилось, может кто-то напишет ещё
PHP:
скопировать код в буфер обмена
  1.  
  2. $array = [
  3.     [52, 'Петя'],
  4.     [3,  'Сергей'],
  5.     [33, 'Оксана'],
  6.     [3,  'Петя'],
  7.     [10, 'Сергей'],
  8.     [12, 'Петя'],
  9.     [17, 'Люда'],
  10.     [24, 'Сергей'],
  11.     [8,  'Надя']
  12. ];
  13.  
  14. $age = [];
  15. $name = [];
  16. $temp = [];
  17. $result = [];
  18.  
  19. foreach ($array as $arr) {
  20.     foreach ($arr as $key => $val) {
  21.         if (!($key % 2)) {
  22.             $age[] = $val;
  23.         } else {
  24.             $name[] = $val;
  25.         }
  26.     }
  27. }
  28.  
  29. for ($i = 0, $y = count($age); $i < $y; $i++) {
  30.     if (empty($temp[$name[$i]])) {
  31.         $temp[$name[$i]] = $age[$i];
  32.     } elseif ($temp[$name[$i]] < $age[$i]) {
  33.         $temp[$name[$i]] = $age[$i];
  34.     }
  35. }
  36.  
  37. foreach ($temp as $name => $age) {
  38.     $result[] = [$age, $name];
  39. }
  40.  
  41. echo '<pre>'; print_r($result);
  42.  

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

 
 Top
Странник
Отправлено: 15 Июня, 2016 - 18:32:01
Post Id



Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Апр. 2010  


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




Огромное спасибо! Все заработало Улыбка
 
 Top
Строитель Модератор
Отправлено: 15 Июня, 2016 - 19:32:28
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




Странник пишет:
Огромное спасибо! Все заработало Улыбка
Подправил условие в цикле for . В работе ничего не изменилось, просто так проще читать код .
 
 Top
Viper
Отправлено: 15 Июня, 2016 - 19:46:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


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




Строитель count() непосредственно в for() делать не стоит, лучше вынести перед циклом в переменную.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Мелкий Супермодератор
Отправлено: 15 Июня, 2016 - 20:56:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Зачем так сложно?
PHP:
скопировать код в буфер обмена
  1. $result = [];
  2. foreach ($array as $item) {
  3.     if (!isset($result[ $item[1] ]) or $result[ $item[1] ][0] < $item[0]) {
  4.         $result[ $item[1] ] = $item;
  5.     }
  6. }


-----
PostgreSQL DBA
 
 Top
Строитель Модератор
Отправлено: 15 Июня, 2016 - 22:09:27
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




Viper пишет:
Строитель count() непосредственно в for() делать не стоит, лучше вынести перед циклом в переменную.
Ну, вроде бы всё согласно мануалу... Или вы имеете ввиду это замечание: "Вышеприведенный код может работать медленно, так как размер массива вычисляется в каждой итерации" ? Если да, то у меня оптимизированная запись, в которой count() вычисляется только один раз, в момент компиляции (а не перед каждой итерацией).
(Добавление)
Мелкий пишет:
Зачем так сложно?
PHP:
скопировать код в буфер обмена
  1. $result = [];
  2. foreach ($array as $item) {
  3.     if (!isset($result[ $item[1] ]) or $result[ $item[1] ][0] < $item[0]) {
  4.         $result[ $item[1] ] = $item;
  5.     }
  6. }
На более компактный вариант мне не хватило мышления )
 
 Top
Viper
Отправлено: 16 Июня, 2016 - 09:22:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


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




Строитель пишет:
Ну, вроде бы всё согласно мануалу...
туплю Улыбка


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 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