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

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

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

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

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

0

Другие решения

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

0