Группировать элементы массива PHP на основе одного значения в каждом массиве

В настоящее время у меня есть массив, который выглядит так:

  Array
(
[0] => Array
(
[id] => 1
[name] => Test 1
[age] => 42
[another_id] => 5
)

[1] => Array
(
[id] => 2
[name] => Test 2
[age] => 47
[another_id] => 3
)

[2] => Array
(
[id] => 3
[name] => Test 3
[age] => 30
[another_id] => 2
)
[3] => Array
(
[id] => 4
[name] => Test 7
[age] => 60
[another_id] => 3
)
[4] => Array
(
[id] => 5
[name] => Test 10
[age] => 38
[another_id] => 3
)

)

То, что я хочу сделать, это взять все элементы массива и распечатать отчет об элементах, но сгруппировать их по полю ‘another_id’.
Например, результат, который я ищу:

REPORT
**Another id (2)**
Name: Test 3

**Another id (3)**
Name: Test 2
Name: Test 7
Name: Test 10

**Another id (5)**
Name: Test 1

Я могу сгруппировать элементы вместе, но все они остаются в одном массиве, и я не могу отделить их друг от друга для создания отчета

  $grouped_types = array();

foreach($invalid_results as $type){
$grouped_types[$type['another_id']][] = $type;
}
print_r($grouped_types);

Может кто-нибудь мне помочь? Очень признателен!

1

Решение

Я считаю, что вы хотите сделать это:

$grouped_types = array();

foreach($invalid_results as $type){
$grouped_types[$type['another_id']][] = $type['name'];
}
var_dump($grouped_types);

Выход:

array (size=3)
5 =>
array (size=1)
0 => string 'Test 1' (length=6)
3 =>
array (size=3)
0 => string 'Test 2' (length=6)
1 => string 'Test 7' (length=6)
2 => string 'Test 10' (length=7)
2 =>
array (size=1)
0 => string 'Test 3' (length=6)
1

Другие решения

Вы были довольно близки с логикой группировки. Вам просто нужно добавить деталь в аккаунт, если вы еще не создали группировку для текущего ‘another_id’. Затем, результат на самом деле так же прост, как пара вложенных циклов, чтобы пройти каждую группировку, а затем каждый элемент в группе.

$grouped_types = array();

foreach($invalid_results as $type){
if(isset($grouped_types[$type['another_id']]))
{
$grouped_types[$type['another_id']][] = $type;
}
else
{
$grouped_types[$type['another_id']] = array($type);
}
}

foreach($grouped_types as $key => $array)
{
echo "**Another id (" . $key . ")**<br/>"; // if you're not outputting to HTML, use \n instead of <br/>

foreach($array as $type)
{
echo "Name: " . $type["name"] . "<br/>";// if you're not outputting to HTML, use \n instead of <br/>
}

echo "<br/>";
}

DEMO

1

Сначала создайте массив для группировки по другому идентификатору

$grouped_types = array();
foreach($invalid_results as $type){
$grouped_types[$type['another_id']]['name'][] = $type['name'];
}
ksort($grouped_types); // sort by another id

Показывать как отчет

foreach($grouped_types as $key=>$value){
echo "Another id ".$key."\n";
foreach($value['name'] as $k=>$v){
echo "Name: ".$v."\n";
}
echo "\n";
}

Выход:

Another id  2
Name:  Test 3

Another id  3
Name:  Test 2
Name:  Test 7
Name:  Test 10

Another id  5
Name:  Test 1

Используйте этот код, чтобы добавить любое количество полей и отобразить их.

$grouped_types = array();

foreach($invalid_results as $type){
// add any number of fields here
$grouped_types[$type['another_id']][] = array('name'=>$type['name'],'age'=>$type['age']);

}

ksort($grouped_types);
print_r($grouped_types);
foreach($grouped_types as $key=>$value){
echo "Another ".$key."\n";
foreach($value as $k=>$v){
foreach($v as $g=>$r){
echo $g." ".$r.",";
}
echo "\n";
}
echo "\n";
}
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector