С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/40: Рейтинг темы: голосов - 40, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 06.06.2013
Сообщений: 23

Группировка массива

19.06.2014, 12:14. Показов 8459. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо сгруппировать по любому полю, которое я укажу в качестве параметра функции. К видите хочу по name но не получается, прошу помощи. Заранее спасибо.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
/**
* @param string - искомое имя
* @param int - нужный идентификатор
* @param array - массив с данными, который нужно обработать
* @return mixed array/bool
*
*/
function resort($name, $array){
$res = array();
  foreach($array as $el){
    if($el['name'] == $name && $el['id'] == $id)
        $res[$el[name]][] = $el; 
  }
 
  return isset($res) ? $res : false;
}
$array= array(
            0=>array("name"=>"Ivan", 'id'=>1),
            1=>array("name"=>"Ivan", 'id'=>2),
            2=>array("name"=>"Sergei", 'id'=>3),
            3=>array("name"=>"Ivan", 'id'=>4)); 
 
$res=resort($name, $array); 
        
echo '<pre>';
print_r($res);
?>
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.06.2014, 12:14
Ответы с готовыми решениями:

Группировка массива
Никак не сображу( Есть массив: $db = array( array (&quot;id&quot; =&gt; &quot;02003&quot;, &quot;name&quot; =&gt; &quot;A&quot;, &quot;attr&quot; =&gt; &quot;white&quot;), array...

Группировка массива
Привет, помогите сгруппировать массив. вообщем есть значения (из бд). нужно сделать из него 4 группы (bootstrap col-md-3 col-sm-6...

Группировка массива
Имеется массив $array = , , , , ];

17
 Аватар для V@D!k
249 / 249 / 98
Регистрация: 26.07.2010
Сообщений: 1,685
19.06.2014, 12:16
Цитата Сообщение от Diana95 Посмотреть сообщение
f($el['name'] == $name && $el['id'] == $id)
откуда тут взялся id?
1
0 / 0 / 0
Регистрация: 06.06.2013
Сообщений: 23
19.06.2014, 12:20  [ТС]
Ну так у меня поле id в массиве или не надо?
0
 Аватар для V@D!k
249 / 249 / 98
Регистрация: 26.07.2010
Сообщений: 1,685
19.06.2014, 12:25
Лучший ответ Сообщение было отмечено Diana95 как решение

Решение

Цитата Сообщение от Diana95 Посмотреть сообщение
function resort($name, $array){
$res = array();
* foreach($array as $el){
* * if($el['name'] == $name && $el['id'] == $id)
* * * * $res[$el[name]][] = $el;
* }
return isset($res) ? $res : false;
}
смотрите в чем суть: вы передаете в функцию массив и параметр name, id в вашей функции не существует.
второе:
Цитата Сообщение от Diana95 Посмотреть сообщение
$res=resort($name, $array);
вы вызываете функцию с параметром $name, а $name у вас нигде не объявляется

Добавлено через 1 минуту
лучше скажите в каком виде вам нужен результат
1
0 / 0 / 0
Регистрация: 06.06.2013
Сообщений: 23
19.06.2014, 12:25  [ТС]
Я тут исправила
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
/**
* @param string - искомое имя
* @param int - нужный идентификатор
* @param array - массив с данными, который нужно обработать
* @return mixed array/bool
*
*/
function resort($array, $name){
$res = array();
      foreach($array as $el){
        if($el['name'] == $name)
            $res[$el['name']][] = $el;
      }
      return isset($res) ? $res : false;
}
$array= array(
            0=>array("name"=>"Ivan", 'id'=>1),
            1=>array("name"=>"Ivan", 'id'=>2),
            2=>array("name"=>"Sergei", 'id'=>3),
            3=>array("name"=>"Ivan", 'id'=>4));
 
$res=resort($array, 'Ivan'); 
     
echo '<pre>' . print_r($res,1) . '</pre>';
        
?>
0
 Аватар для V@D!k
249 / 249 / 98
Регистрация: 26.07.2010
Сообщений: 1,685
19.06.2014, 12:29
ну если вы именно такой результат хотели получить, тогда все верно
1
0 / 0 / 0
Регистрация: 06.06.2013
Сообщений: 23
19.06.2014, 12:43  [ТС]
Теперь у меня новая задача, я должна группировать по конкретному полю, т.е. если указан id когда вызываю, то группирую по id, а если по name, то по name и выдавать все значения.
Например, $res=resort($array, 'id'); и обращаться к функции которая сгруппирует их id, а у меня уже функция под name заточена, как это сделать мой необразованный мозг пока не знает. Простите за то что пристаю всё.

Добавлено через 9 минут
Цитата Сообщение от V@D!k Посмотреть сообщение
ну если вы именно такой результат хотели получить, тогда все верно
Теперь у меня новая задача, я должна группировать по конкретному полю, т.е. если указан id когда вызываю, то группирую по id, а если по name, то по name и выдавать все значения.
Например, $res=resort($array, 'id'); и обращаться к функции которая сгруппирует их id, а у меня уже функция под name заточена, как это сделать мой необразованный мозг пока не знает. Простите за то что пристаю всё.
0
9 / 9 / 6
Регистрация: 22.10.2013
Сообщений: 36
19.06.2014, 12:45
Diana95, что-то типа вот этого?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
/**
 * @param string - искомое имя
 * @param int - нужный идентификатор
 * @param array - массив с данными, который нужно обработать
 * @return mixed array/bool
 *
 */
function resort($array, $name, $value){
    $res = array();
 
    foreach($array as $el){
        if($el[$name] == $value)
            array_push($res, $el);
    }
    return isset($res) ? $res : false;
}
$array= array(
    0=>array("name"=>"Ivan", 'id'=>1),
    1=>array("name"=>"Ivan", 'id'=>2),
    2=>array("name"=>"Sergei", 'id'=>3),
    3=>array("name"=>"Ivan", 'id'=>1));
 
$res=resort($array, 'name', 'Ivan');
echo '<pre>' . print_r($res,1) . '</pre>';
 
$res=resort($array, 'id', 1);
echo '<pre>' . print_r($res,1) . '</pre>';
?>
1
 Аватар для V@D!k
249 / 249 / 98
Регистрация: 26.07.2010
Сообщений: 1,685
19.06.2014, 12:48
Лучший ответ Сообщение было отмечено Diana95 как решение

Решение

у меня получилось что-то такое
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function resort($array, $field){
    $res = array();
    foreach($array as $item)
        $new_arr[]=$item[$field];
    $unique=array_unique($new_arr);
    print_r($unique);
    foreach($array as $key=> &$el){
        foreach($unique as $value){
            if($el[$field]==$value){
                $res[$value][]=$el;
            }
        }
 
    }
    return isset($res) ? $res : false;
}
$array= array(
    0=>array("name"=>"Ivan", 'id'=>1),
    1=>array("name"=>"Ivan", 'id'=>2),
    2=>array("name"=>"Sergei", 'id'=>3),
    3=>array("name"=>"Ivan", 'id'=>4));
 
$res=resort($array, 'name');
 
echo '<pre>' . print_r($res,1) . '</pre>';
1
0 / 0 / 0
Регистрация: 06.06.2013
Сообщений: 23
19.06.2014, 13:39  [ТС]
Всё супер а теперь нужна многомерная группировка!! Как мне это надоело уже!
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
function resort($array, $key){
$res = array();
      foreach($array as $el){
 //       if($el[$key] == $el[$key])
            $res[$el[$key]][] = $el;
      }
      return isset($res) ? $res : false;
}
$array= array(
            0=>array("name"=>"Ivan", 'id'=>1),
            1=>array("name"=>"Ivan", 'id'=>2),
            2=>array("name"=>"Sergei", 'id'=>3),
            3=>array("name"=>"Ivan", 'id'=>4));
 
$res=resort($array, 'id'); 
     
echo '<pre>' . print_r($res,1) . '</pre>';
        
?>
0
 Аватар для V@D!k
249 / 249 / 98
Регистрация: 26.07.2010
Сообщений: 1,685
19.06.2014, 13:43
что значит многомерная?
1
0 / 0 / 0
Регистрация: 06.06.2013
Сообщений: 23
19.06.2014, 13:45  [ТС]
Цитата Сообщение от V@D!k Посмотреть сообщение
что значит многомерная?
группировать по name, а внутри по id
группировать по id, а внутри по name
Надеюсь так понятно.
0
 Аватар для V@D!k
249 / 249 / 98
Регистрация: 26.07.2010
Сообщений: 1,685
19.06.2014, 13:49
не особо лучше напишите как это должно выглядеть что-то типа такого примера:
Array
(
[Ivan] => Array
(
[0] => Array
(
[name] => Ivan
[id] => 1
)

[1] => Array
(
[name] => Ivan
[id] => 2
)

[2] => Array
(
[name] => Ivan
[id] => 4
)

)

[Sergei] => Array
(
[0] => Array
(
[name] => Sergei
[id] => 3
)
)
)
0
0 / 0 / 0
Регистрация: 06.06.2013
Сообщений: 23
19.06.2014, 14:43  [ТС]
Ну вот например такой массив
$array= array(
0=>array("name"=>"Ivan", 'id'=>5),
1=>array("name"=>"Ivan", 'id'=>2),
2=>array("name"=>"Sergei", 'id'=>3),
3=>array("name"=>"Ivan", 'id'=>4));
Я задаю группировку и вот сейчас вот так у меня получается:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Array
(
    [5] => Array
        (
            [0] => Array
                (
                    [name] => Ivan
                    [id] => [B]5[/B]
                )
 
        )
 
    [2] => Array
        (
            [0] => Array
                (
                    [name] => Ivan
                    [id] => 2
                )
 
        )
 
    [3] => Array
        (
            [0] => Array
                (
                    [name] => Sergei
                    [id] => [B]3[/B]
                )
 
        )
 
    [4] => Array
        (
            [0] => Array
                (
                    [name] => Ivan
                    [id] => 4
                )
 
        )
 
)
А надо чтобы
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Array
(
    [5] => Array
        (
            [0] => Array
                (
                    [name] => Ivan
                    [id] => [B]2[/B]
                )
 
        )
 
    [2] => Array
        (
            [0] => Array
                (
                    [name] => Ivan
                    [id] => 3
                )
 
        )
 
    [3] => Array
        (
            [0] => Array
                (
                    [name] => Sergei
                    [id] => [B]5[/B]
                )
 
        )
 
    [4] => Array
        (
            [0] => Array
                (
                    [name] => Ivan
                    [id] => 4
                )
 
        )
 
)
Добавлено через 50 секунд
Если что выделил изменения тэгами жирное выделение

Добавлено через 18 минут
Цитата Сообщение от V@D!k Посмотреть сообщение
не особо лучше напишите как это должно выглядеть что-то типа такого примера:
Array
(
[Ivan] => Array
(
[0] => Array
(
[name] => Ivan
[id] => 1
)
[1] => Array
(
[name] => Ivan
[id] => 2
)
[2] => Array
(
[name] => Ivan
[id] => 4
)
)
[Sergei] => Array
(
[0] => Array
(
[name] => Sergei
[id] => 3
)
)
)
Как это сделать я не знаю.

Добавлено через 26 минут
Вадим, теперь понятнее?
0
 Аватар для V@D!k
249 / 249 / 98
Регистрация: 26.07.2010
Сообщений: 1,685
19.06.2014, 14:57
честно говоря, это похоже на какую-то, извините, порнографию, и я не понимаю смысла и логики этих действий
1
0 / 0 / 0
Регистрация: 06.06.2013
Сообщений: 23
19.06.2014, 15:12  [ТС]
Это расскажите моему преподавателю, который хочет этой задачей научить нас работать с массивами, ну и заодно группировку приписал.

Добавлено через 8 минут
Ой блин попутала вот так:
Array
(
[Ivan] => Array
(
[0] => Array
(
[name] => Ivan
[id] => 5
)

[1] => Array
(
[name] => Ivan
[id] => 2
)

[2] => Array
(
[name] => Ivan
[id] => 4
)

)

[Sergei] => Array
(
[0] => Array
(
[name] => Sergei
[id] => 3
)

)

А надо вот так
Array
(
[Ivan] => Array
(
[0] => Array
(
[name] => Ivan
[id] => 2
)

[1] => Array
(
[name] => Ivan
[id] => 4
)

[2] => Array
(
[name] => Ivan
[id] => 5
)

)

[Sergei] => Array
(
[0] => Array
(
[name] => Sergei
[id] => 3
)

)

Просто группировка по полю id была
0
 Аватар для V@D!k
249 / 249 / 98
Регистрация: 26.07.2010
Сообщений: 1,685
19.06.2014, 15:22
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function resort($array, $field){
    $res = array();
    foreach($array as $item)
        $new_arr[]=$item[$field];
    $unique=array_unique($new_arr);
    print_r($unique);
    foreach($array as $key=> &$el){
        foreach($unique as $value){
            if($el[$field]==$value){
                $res[$value][]=$el;
            }
        }
 
    }
    return isset($res) ? $res : false;
}
$array= array(
    0=>array("name"=>"Ivan", 'id'=>5),
    1=>array("name"=>"Ivan", 'id'=>2),
    2=>array("name"=>"Sergei", 'id'=>3),
    3=>array("name"=>"Ivan", 'id'=>4));
 
$res=resort($array, 'name');
function myCmp($a, $b) {
    if ($a['id'] === $b['id']) return 0;
    return $a['id'] > $b['id'] ? 1 : -1;
}
foreach($res as &$value){
    uasort($value, 'myCmp');
}
 
echo '<pre>' . print_r($res,1) . '</pre>';
1
0 / 0 / 0
Регистрация: 06.06.2013
Сообщений: 23
19.06.2014, 20:21  [ТС]
Спасибо большое надеюсь что это будет последнее.

Добавлено через 45 минут
Я его убью, но наконец-то последнее задание, теперь массив в виде
$array= array(
0=>array("name"=>"Ivan", 'id'=>5, 'city' => 'Piter'),
1=>array("name"=>"Ivan", 'id'=>10, 'city' => 'Moscow'),
2=>array("name"=>"Sergei", 'id'=>3, 'city' => 'Piter'),
3=>array("name"=>"Ivan", 'id'=>4, 'city' => 'Piter'));

И если я задаю $key = array('city','name');, то должен отсортировать сначала по городам, например, Piter следом всех по именам, т.е. все Ivan и Sergei, которые в этом городе живут и там дальше как было, т.е. просто ещё один уровень добавился. НО! надо придумать, чтобы программа при дальнейших добавлениях новых полей снова формировалась не только как сейчас 2-х уровневый,т.е. была универсальной.
P.S. Для тех кто решит эту задачу, оставьте номер своего кошелька в долгу не останусь.

Добавлено через 5 минут
Напомню если что вот моя программа полностью
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
function resort($array, $key){
$res = array();
      foreach($array as $el){
 //       if($el[$key] == $el[$key])
            $res[$el[$key]][] = $el;
      }
    return isset($res) ? $res : false;
}
$array= array(
    0=>array("name"=>"Ivan", 'id'=>5, 'city' => 'Piter'),
    1=>array("name"=>"Ivan", 'id'=>10, 'city' => 'Moscow'),
    2=>array("name"=>"Sergei", 'id'=>3, 'city' => 'Piter'),
    3=>array("name"=>"Ivan", 'id'=>4, 'city' => 'Piter'));
 
 $key = array('city','name');
$res=resort($array, 'name');
function myCmp($a, $b) {
    if ($a['id'] === $b['id']) return 0;
    return $a['id'] > $b['id'] ? 1 : -1;
}
foreach($res as &$value){
    uasort($value, 'myCmp');
}
 
echo '<pre>' . print_r($res,1) . '</pre>';
 
?>
Добавлено через 3 часа 54 минуты
Видимо сложная задача.....ладно сама что-нибудь придумаю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.06.2014, 20:21
Помогаю со студенческими работами здесь

Группировка массива по общему свойству
Имеем массив, который содержит в себе свойство группировки для каждого товара. Несколько товаров могут иметь одно общее свойство, они...

Группировка и сложение значений двумерного массива по совпадению двух значений
Всем добрый день! Голову сломал, смиренно прошу помощи. Есть двумерный массив, задача: объединить (сгруппировать) элементы при...

RegExp: группировка
Всем привет! Нужно реализовать следующую вещь, средвами PCRE (preg_match). Pattern: &quot;&quot; вообщем, ищется подстрока в тегах...

Группировка диапазонов чисел
Подскажите скриптик для решения задачи. есть дипазон 89000000000-89002187999 89002190000-89004649999 нужно привести к виду ...

Массив - группировка строк
Обратите, пожалуйста, внимание на рисунок. Предположим в базе данных есть такая таблица как в верхней части рисунка. Нужно вывести данные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru