【问题标题】:How to merge subarrays by a single key value and count the duplicates?如何通过单个键值合并子数组并计算重复项?
【发布时间】:2015-12-13 16:50:54
【问题描述】:

我是 stackoverflow 的新手,需要一些帮助。

我正在尝试从 PHP 中的多维数组中删除重复项,例如:

Array ( 
    [0] => Array ( [Plat] => hello [Data] => 01/01/2015 [Term] => PHP [Quan] => 1 ) 
    [1] => Array ( [Plat] => hello [Data] => 01/01/2015 [Term] => PHP [Quan] => 1 )
    [2] => Array ( [Plat] => hello [Data] => 03/01/2015 [Term] => PHP [Quan] => 1 ) 
    [3] => Array ( [Plat] => hello [Data] => 03/01/2015 [Term] => PHP [Quan] => 1 ) 
    [4] => Array ( [Plat] => hello [Data] => 03/01/2015 [Term] => PHP [Quan] => 1 ) 
    [5] => Array ( [Plat] => hello [Data] => 03/01/2015 [Term] => PHP [Quan] => 1 )
)

并创建一个数组,删除重复项并将其添加到Quan 中找到的重复项数,如下所示(按数据过滤):

Array ( 
    [0] => Array ( [Plat] => hello [Data] => 01/01/2015 [Term] => PHP [Quan] => 2 ) 
    [1] => Array ( [Plat] => hello [Data] => 03/01/2015 [Term] => PHP [Quan] => 4 ) 
)

我的代码如下:($top 是数组)

foreach($top as $value){
    if(!empty($temp_top)){
        for($i =0;$i<sizeof($temp_top);$i++){
            if($value['Data'] == $temp_top[$i]['Data'] ){
                $temp_top[$i]['Quan'] +=1;
            }else{
                $temp_top[] = $value;
            }
        }
    }else{
        $temp_top[] = $value;
    }
}

我尝试了一些我在堆栈上找到的答案,例如:

$input = array_map("unserialize", array_unique(array_map("serialize", $top)));

但我无法将Quan 的数量加起来。

【问题讨论】:

标签: php arrays merge duplicates counting


【解决方案1】:

您将需要实现临时键,以便在迭代数组时,可以确定您是否正在处理 Data 的第一次出现。如果没有,您只需将当前的Quan 值添加到第一次出现的Quan 值。

完成循环后,您可以通过调用 array_values() 删除临时键(重新索引)。

代码:(Demo)

$array = [
    ["Plat" => "hello", "Data" => "01/01/2015", "Term" => "PHP", "Quan" => "1"],
    ["Plat" => "hello", "Data" => "01/01/2015", "Term" => "PHP", "Quan" => "1"],
    ["Plat" => "hello", "Data" => "03/01/2015", "Term" => "PHP", "Quan" => "1"],
    ["Plat" => "hello", "Data" => "03/01/2015", "Term" => "PHP", "Quan" => "1"],
    ["Plat" => "hello", "Data" => "03/01/2015", "Term" => "PHP", "Quan" => "1"],
    ["Plat" => "hello", "Data" => "03/01/2015", "Term" => "PHP", "Quan" => "1"],
];

foreach ($array as $row) {
    if (!isset($result[$row['Data']])) {
        $result[$row['Data']] = $row;
    } else {
        $result[$row['Data']]['Quan'] += $row['Quan'];
    }
}
$result = array_values($result);
var_export($result);

输出:

array (
  0 => 
  array (
    'Plat' => 'hello',
    'Data' => '01/01/2015',
    'Term' => 'PHP',
    'Quan' => 2,
  ),
  1 => 
  array (
    'Plat' => 'hello',
    'Data' => '03/01/2015',
    'Term' => 'PHP',
    'Quan' => 4,
  ),
)

*注意如果你想忽略Quan的值,每次只添加1,你可以使用:

if (!isset($result[$row['Data']])) {
    $result[$row['Data']]['Quan'] = 1;
} else {
    ++$result[$row['Data']]['Quan'];
}

由于Quan 列数据,您的问题对此逻辑不明确。

【讨论】:

    【解决方案2】:

    我自己在其他帖子的帮助下找到了解决方案。

    这是我的代码示例:

    $temp_top = array_map("unserialize", array_unique(array_map("serialize", $top)));
        $numvezesfound=0;
    
        foreach($temp_top as $key => $value){
                for($i =0;$i<sizeof($top);$i++){
                    if($value['Data'] == $top[$i]['Data'] ){
                        $numvezesfound +=1;
                    }
                }
                $temp_top[$key]['Quan'] = $numvezesfound;
                $numvezesfound = 0;
            }       
        $top = $temp_top;
    

    如果有人可以帮助我使这段代码更漂亮,我会欠你的 :)

    谢谢大家!

    【讨论】:

      猜你喜欢
      • 2020-09-08
      • 1970-01-01
      • 2011-01-09
      • 2020-01-02
      • 2013-03-07
      • 2011-08-30
      • 2017-09-25
      • 2013-11-08
      相关资源
      最近更新 更多