Я пытаюсь выяснить простой способ удалить/удалить значения повторяющихся массивов, основанные на более высоком вторичном значении в массиве в php.
Вот простой пример исходного массива.
$ar = array(
array('pid'=>'544', 'discount'=>'26.00','promo_id'=>'9807'),
array('pid'=>'544', 'discount'=>'15.00','promo_id'=>'9821'),
array('pid'=>'544', 'discount'=>'21.00','promo_id'=>'9811'),
array('pid'=>'2965','discount'=>'25.00','promo_id'=>'9810'),
array('pid'=>'2965','discount'=>'30.50','promo_id'=>'9809'),
array('pid'=>'1866','discount'=>'30.00','promo_id'=>'9810'),
array('pid'=>'1866','discount'=>'25.50','promo_id'=>'9809')
);
Это будет массив NEW, который я бы хотел получить.
$ar = array(
array('pid'=>'544', 'discount'=>'26.00','promo_id'=>'9807'),
array('pid'=>'2965','discount'=>'30.50','promo_id'=>'9809'),
array('pid'=>'1866','discount'=>'30.00','promo_id'=>'9810'),
);
Это будут ключи, которые были удалены.
//array('pid'=>'1866','discount'=>'25.50','promo_id'=>'9809') Removed!
//array('pid'=>'544', 'discount'=>'21.00','promo_id'=>'9811'), Removed!
//array('pid'=>'544', 'discount'=>'15.00','promo_id'=>'9821'), Removed!
//array('pid'=>'2965','discount'=>'25.00','promo_id'=>'9810'), Removed!
Я хотел бы, чтобы удалить повторяющиеся значения из 'pid'
, сохраняя высочайшее значение 'discount'
.
В массиве может быть более двух ключей, имеющих один и тот же 'pid'
но у них никогда не будет одинаковых 'pid'
и 'promo_id'
.
Надеюсь, для этого есть простое решение.
РЕДАКТИРОВАТЬ:
Вот что я пытался.
foreach($ar as $tkey => $v) {
$tPID = $v['pid'];
$tDISC = $v['discount'];
if ($tPID) {
$key = array_search($tPID, array_column($ar, 'pid'));
$aPID = $ar[$key]['pid'];
$aTPRD = $ar[$key]['discount'];
if ($aTPRD < $tDISC) {
echo '(UN:'.$tkey.')'; unset($ar[$tkey]);
}else
if ($aTPRD > $tDISC) {
echo '(UN:'.$key.')'; unset($ar[$key]);
}else{echo 'else'; }
}
}
Создайте выходной массив с ключом "pid", который содержит самую высокую учетную запись со скидкой, найденную для pid.
Извлеките выходной массив, используя 'array_values'.
Было предложено изменить код, чтобы сделать его короче. Тем не менее, я стараюсь, чтобы код был легко понят, а не пытался сделать его минимальным количеством кода. Этот код достаточно эффективен, как и в любом случае.
<?php //
$ar = array(
array('pid'=>'544', 'discount'=>'26.00','promo_id'=>'9807'),
array('pid'=>'544', 'discount'=>'15.00','promo_id'=>'9821'),
array('pid'=>'544', 'discount'=>'21.00','promo_id'=>'9811'),
array('pid'=>'2965','discount'=>'25.00','promo_id'=>'9810'),
array('pid'=>'2965','discount'=>'30.50','promo_id'=>'9809'),
array('pid'=>'1866','discount'=>'30.00','promo_id'=>'9810'),
array('pid'=>'1866','discount'=>'25.50','promo_id'=>'9809')
);
$outUnique = array();
foreach ($ar as $entry) {
$curPid = $entry['pid'];
if (isset($outUnique[$curPid])) { // check the discount
if ($entry['discount'] > $outUnique[$curPid]['discount']) {
$outUnique[$curPid] = $entry;
}
}
else { // add to the output
$outUnique[$curPid] = $entry;
}
}
// show the entries
var_dump(array_values($outUnique));