Я новичок в 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
данные столбца.