сбросить ключи массива на основе сравнения двух значений массива в одном массиве

0

Я пытаюсь выяснить простой способ удалить/удалить значения повторяющихся массивов, основанные на более высоком вторичном значении в массиве в 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'; }

    }
}
  • 0
    А твоя попытка?
  • 0
    Посмотрите на php.net/manual/en/function.array-intersect-ukey.php . Вы можете написать обратный звонок и сравнить pid в нем.
Показать ещё 1 комментарий
Теги:
arrays

1 ответ

1
Лучший ответ

Создайте выходной массив с ключом "pid", который содержит самую высокую учетную запись со скидкой, найденную для pid.

Извлеките выходной массив, используя 'array_values'.

Рабочий код на Codepad.org...

Было предложено изменить код, чтобы сделать его короче. Тем не менее, я стараюсь, чтобы код был легко понят, а не пытался сделать его минимальным количеством кода. Этот код достаточно эффективен, как и в любом случае.

 <?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));
  • 0
    Замечательно! Спасибо за это, это намного проще, чем я делал это.
  • 0
    @monty, пожалуйста.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню