如何按单个键值合并子数组并对重复项进行计数


How to merge subarrays by a single key value and count the duplicates?

我是新来的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有多少

在别人的帮助下,我自己找到了一个解决办法。

下面是我的代码示例:

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

如果有人能帮助我使这段代码更漂亮,我将在你的债务:)

谢谢大家!

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

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

代码(演示):

$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列数据,您的问题在这个逻辑上是模糊的。