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
Форумы портала PHP.SU :: Версия для печати :: Как сделать выборку из массива?
Форумы портала PHP.SU » » Вопросы новичков » Как сделать выборку из массива?

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

1. Странник - 15 Июня, 2016 - 11:16:06 - перейти к сообщению
Есть следующий массив:

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. )
2. Строитель - 15 Июня, 2016 - 14:28:13 - перейти к сообщению
Странник пишет:
Подскажите как удалить из массива ненужные элементы, так, чтоб имена не повторялись, а из тех что повторялись, осталось Имя с максимальным возрастом
У меня варианта покороче не получилось, может кто-то напишет ещё
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.  
3. Странник - 15 Июня, 2016 - 18:32:01 - перейти к сообщению
Огромное спасибо! Все заработало Улыбка
4. Строитель - 15 Июня, 2016 - 19:32:28 - перейти к сообщению
Странник пишет:
Огромное спасибо! Все заработало Улыбка
Подправил условие в цикле for . В работе ничего не изменилось, просто так проще читать код .
5. Viper - 15 Июня, 2016 - 19:46:46 - перейти к сообщению
Строитель count() непосредственно в for() делать не стоит, лучше вынести перед циклом в переменную.
6. Мелкий - 15 Июня, 2016 - 20:56:50 - перейти к сообщению
Зачем так сложно?
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. }
7. Строитель - 15 Июня, 2016 - 22:09:27 - перейти к сообщению
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. }
На более компактный вариант мне не хватило мышления )
8. Viper - 16 Июня, 2016 - 09:22:28 - перейти к сообщению
Строитель пишет:
Ну, вроде бы всё согласно мануалу...
туплю Улыбка

 

Powered by ExBB FM 1.0 RC1