Как объединить подмассивы по одному ключевому значению и подсчитать дубликаты?

Я новичок в 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.


person vs29    schedule 16.09.2015    source источник
comment
возможный дубликат Как удалить повторяющиеся значения из многомерного массива в PHP   -  person Jonathan Bender    schedule 17.09.2015
comment
Джонатан Бендер, я не думаю, что это дубликат, но спасибо .. я видел это и использовал код, который был объяснен там, но я не могу обновить [Quan] :(   -  person vs29    schedule 17.09.2015


Ответы (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;

если кто-то может помочь мне сделать этот код более красивым, я буду у вас в долгу :)

спасибо всем!

person vs29    schedule 17.09.2015

Вам нужно будет реализовать временные ключи, чтобы при повторении массива вы могли определить, обрабатываете ли вы первое вхождение 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.

person mickmackusa    schedule 29.03.2018