【问题标题】:PHP Data MappingPHP 数据映射
【发布时间】:2017-03-20 10:19:41
【问题描述】:

我有一些数据集,必须对其进行映射,对重复项进行分组,如下所示:

我有:

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

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

【问题讨论】:

  • 如果名称是有效的标识符,您可以创建一个数组,其中名称是键,数字数组是值。如果不是,您可以使用哈希函数,并将其用作键。 (并将名称也存储在数组中)。

标签: php arrays data-management


【解决方案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
                )

        )

)

【讨论】:

    【解决方案2】:

    您还可以查看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

    【讨论】:

      【解决方案3】:

      可能是可能的解决方案:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-03
        • 1970-01-01
        • 1970-01-01
        • 2016-10-10
        • 2011-07-08
        • 2017-10-25
        • 2011-09-27
        • 1970-01-01
        相关资源
        最近更新 更多