查找重复的值并比较另一个键

时间:2018-09-03 11:06:19

标签: php arrays duplicates compare

我需要您的建议。我有一个数组,我需要找到具有相同键值的数组。然后,我需要比较已建立数组的另一个键,并删除键值较低的数组。

以下示例。

如您所见,有两个具有相同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 :(得分:0)

您可以使用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