0

I got some data set and it must be mapped, grouping duplicates, like this:

I have:

<?php
$var = array(
    array("Name" => "Alfred", "Number" => 1),
    array("Name" => "Alfred", "Number" => 2),
    array("Name" => "Alfred", "Number" => 3),
    array("Name" => "Aethelstan", "Number" => 4),
    array("Name" => "Aethelstan", "Number" => 5),
    array("Name" => "Aethelstan", "Number" => 6),
)
?>

I want to change it to:

<?php
$var = array(
    array("name" => "Alfred","Number" => array(1,2,3)),
    array("name" => "Aelthestan","Number" => array(4,5,6)),
)
?>

Someone has any ideas without lots of loops and one-by-one comparisons?

Yaman Jain
  • 1,254
  • 11
  • 16
Valentoni
  • 308
  • 4
  • 19
  • 1
    If the names are valid identifiers, you can create an array, where the names are the keys, and an array of the numbers the values. If they are not, you can use a hash function, and use that as the key. (And store the name in the array as well). – Dan Mar 20 '17 at 10:24

3 Answers3

1

Hope this will work.

PHP code demo

<?php
$var = array(
    array("Name" => "Alfred", "Number" => 1),
    array("Name" => "Alfred", "Number" => 2),
    array("Name" => "Alfred", "Number" => 3),
    array("Name" => "Aethelstan", "Number" => 4),
    array("Name" => "Aethelstan", "Number" => 5),
    array("Name" => "Aethelstan", "Number" => 6),
);
$result=array();
foreach($var as $value)
{
    if(!isset($result[$value["Name"]]))
    {
        $result[$value["Name"]]=array("Name"=>$value["Name"],"Number"=>array($value["Number"]));
    }
    else
    {
        $result[$value["Name"]]["Number"][]=$value["Number"];
    }

}
$result=array_values($result);
print_r($result);

Output:

Array
(
    [0] => Array
        (
            [Name] => Alfred
            [Number] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                )

        )

    [1] => Array
        (
            [Name] => Aethelstan
            [Number] => Array
                (
                    [0] => 4
                    [1] => 5
                    [2] => 6
                )

        )

)
Sahil Gulati
  • 15,028
  • 4
  • 24
  • 42
1

You could also take a look at array_reduce for a more functional/declarative/immutable approach:

<?php

$flatData = [
  ['name' => 'foo', 'number' => 1],
  ['name' => 'foo', 'number' => 2],
  ['name' => 'foo', 'number' => 3],
  ['name' => 'bar', 'number' => 4],
  ['name' => 'bar', 'number' => 5],
  ['name' => 'bar', 'number' => 6],
];

$treeData = array_reduce($flatData, function ($tree, $data) {
  $key = $data['name'];

  if (empty($tree[$key])) {
    $tree[$key] = $data;
    unset($tree[$key]['number']);
  }

  $tree[$key]['numbers'][] = $data['number'];

  return $tree;
}, []);

print_r($treeData);

https://repl.it/G4Cg

Leo Cavalcante
  • 2,327
  • 2
  • 22
  • 30
-1

Can be the possible solution:

<?php
$var = array(
    array("Name" => "Alfred", "Number" => 1),
    array("Name" => "Alfred", "Number" => 2),
    array("Name" => "Alfred", "Number" => 3),
    array("Name" => "Aethelstan", "Number" => 4),
    array("Name" => "Aethelstan", "Number" => 5),
    array("Name" => "Aethelstan", "Number" => 6),
);

$result = [];
foreach ($var as $key => $value) {
    if (!isset($result[$value['Name']])) {
        $result[$value['Name']] =[];
    }
    $result[$value['Name']][] = $value['Number'];
}

$final_result = [];
foreach ($result as $key => $value) {
    $final_result[] = ["name" => $key, "number" => $value];
}

print_r($final_result);
Yaman Jain
  • 1,254
  • 11
  • 16