2017-03-20 152 views
0

我得到了一些数据集,它必须被映射,分组重复,像这样:PHP数据映射

我:

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

我想将它更改为:

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

有人有没有很多循环和一对一比较的想法?

+1

如果名称是有效的标识符,您可以创建一个数组,其中姓名是键,并且数字值的数组。如果不是,您可以使用散列函数,并将其用作关键字。 (并将名称存储在数组中)。 – Dan

回答

1

希望这会起作用。

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

输出:

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

可以在可能的解决方案:

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

你也可以看看array_reduce了更多的功能/声明/不可变的方法:

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