найти повторяющиеся значения и сравнить другой ключ - PullRequest
0 голосов
/ 03 сентября 2018

Мне нужен совет от вас. У меня есть массив, и мне нужно найти массивы с таким же значением ключа. Затем мне нужно сравнить другой ключ найденных массивов и удалить массив, который имеет меньшее значение ключа.

Пример ниже.

Как видите, есть два массива с одним и тем же ключом EAN. Мне нужно найти массивы с тем же EAN. Затем сравните эти два массива по ключу ProductCount. Массив с более высоким ProdouctCount должен быть удален. Вы понимаете?

[20] => Array
    (
        [ean] => **6900532615069**
        [productPrice] => 1140
        [productCount] => 50
    )
[25] => Array
    (
        [ean] => 6900535364122
        [productPrice] => 1140
        [productCount] => 50
    )

[36] => Array
    (
        [ean] => **6900532615069**
        [productPrice] => 1140
        [productCount] => 10
    )

function removeduplicateKeys($data){

$_data = array();

foreach ($data as $v) {
  if (isset($_data[$v['ean']])) {
    // found duplicate
    continue;
  }
  // remember unique item
  $_data[$v['ean']] = $v;
}

$data = array_values($_data);
return $data;

}

Таким образом, вывод должен быть

[25] => Array
    (
        [ean] => 6900535364122
        [productPrice] => 1140
        [productCount] => 50
    )

[36] => Array
    (
        [ean] => **6900532615069**
        [productPrice] => 1140
        [productCount] => 10
    )

Я пытаюсь сделать это около трёх дней, но не знаю как. Самое последнее, что я сделал, - это удаление дублирующего массива, но я не знаю, как сравнить значение ключа, а затем удалить массив. Буду благодарен за любые советы. Спасибо.

1 Ответ

0 голосов
/ 03 сентября 2018

Вы можете использовать array_column, чтобы сделать массив ассоциативным.
Это означает, что он также будет перезаписывать любые дублирующиеся массивы.
Затем просто array_values, чтобы вернуть его к исходным индексированным ключам.

$arr = array_values(array_column($arr, NULL, "ean"));

Редактировать: я вижу, что вам нужны клавиши 25 и 36.
Код выше даст вам 20 и 25.

Чтобы получить ожидаемый результат, сначала нужно отсортировать массив, чтобы сделать его задом наперед.

rsort($arr);
$arr = array_values(array_column($arr, NULL, "ean"));


array_column создаст массив, подобный этому:

[**6900532615069**] => Array
    (
        [ean] => **6900532615069**
        [productPrice] => 1140
        [productCount] => 50
    )
[6900535364122] => Array
    (
        [ean] => 6900535364122
        [productPrice] => 1140
        [productCount] => 50
    )

[**6900532615069**] => Array
    (
        [ean] => **6900532615069**
        [productPrice] => 1140
        [productCount] => 10
    )

Но так как может быть только один массив с одинаковым ключом, второй массив перезапишет первую запись:

[6900535364122] => Array
    (
        [ean] => 6900535364122
        [productPrice] => 1140
        [productCount] => 50
    )

[**6900532615069**] => Array
    (
        [ean] => **6900532615069**
        [productPrice] => 1140
        [productCount] => 10
    )

Если вы сначала используете rsort(), он удалит другой массив.
Array_values ​​затем удалит «ean» из массива, сделав его 0,1,2 ...

рабочий код https://3v4l.org/sfPQr


если массив не отсортирован, вам нужно сначала отсортировать массив в productcount.

usort($arr, function ($a, $b) {
    return $b['productCount'] - $a['productCount'];
});


$arr = array_values(array_column($arr, NULL, "ean"));
var_dump($arr);

https://3v4l.org/WZKLB

...