2017-03-20 1 views
0

Je suis quelques ensemble de données et il doit être mis en correspondance, les doublons de regroupement, comme ceci:PHP Data Mapping

Je:

<?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), 
) 
?> 

Je veux changer pour:

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

Quelqu'un a des idées sans beaucoup de boucles et des comparaisons un-par-un?

+1

Si les noms sont des identificateurs valides, vous pouvez créer un tableau, où les noms sont les clés, et un tableau des nombres les valeurs. Si ce n'est pas le cas, vous pouvez utiliser une fonction de hachage et l'utiliser comme clé. (Et stocker le nom dans le tableau aussi bien). – Dan

Répondre

1

Espérons que cela fonctionnera.

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); 

Sortie:

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 
       ) 

     ) 

) 
-1

Peut-être la solution possible:

<?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); 
1

Vous pouvez également jeter un oeil à array_reduce pour une/déclarative plus fonctionnel/approche immuable:

<?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