基于一个值从数组中删除重复的对象,在PHP中保持最低的其他值?

时间:2017-02-16 18:19:18

标签: php arrays

现在我在PHP中有一个对象数组,其中一些对象具有“id”的重复值。我正在尝试删除重复项,但我想保留“qty”值最小的那个。

我知道你通常如何从数组中删除重复的整个对象,但不仅仅是一个值是重复的,以及如何保持另一个值的较低值。

示例:

[
    {
        id: 1,
        qty: 200
    },
    {
        id: 1,
        qty: 190
    },
    {
        id: 2,
        qty: 10
    },
    {
        id: 2,
        qty: 12
    },
    {
        id: 2,
        qty: 10
    },
    {
        id: 3,
        qty: 5
    },
    {
        id: 4,
        qty: 5
    },
    {
        id: 4,
        qty: 2
    },
]

我最终想要的是......

[
    {
        id: 4,
        qty: 2
    },
    {
        id: 3,
        qty: 5
    },
    {
        id: 2,
        qty: 10
    },
    {
        id: 1,
        qty: 190
    }
]

这可能吗?

3 个答案:

答案 0 :(得分:4)

看起来几乎像JSON,所以假设你$array = json_decode($json, true)为关联数组:

array_multisort(array_column($array, 'qty'), SORT_DESC, $array);
$result = array_column($array, null, 'id');
  • 提取qty数组并按降序排序,按原来排序
  • id作为键
  • 的数组中提取

使用array_column()进行提取会导致最后一个id键覆盖以前的密钥。最后一个将是具有最低qty的那个,因为它被排序为DESCending。

如果需要将其恢复为JSON对象,则只需重新索引:

$json = json_encode(array_values($result));

答案 1 :(得分:1)

AbraCadaver提出了这么好的答案,但我努力想出我的想法,所以我想分享它,以防它对某人有用。如果有的话,它可能对扩展或更复杂的数组有用。我走了创建嵌套循环的路线。这是代码:

function loadImage(conditions){
    var imageSRC = "img/weather/hero-";
    var validConditions = ["clear", "cloudy", "rain", "snow"];
    var timeOfDay = getTimeOfDay();
    conditions = conditions.toLowerCase();
    if (validConditions.indexOf(conditions) === -1) {
        conditions = "cloudy";
    } else {
        conditions = conditions;
    }
    console.log(conditions);

    var apiImg = imageSRC + conditions + ".jpeg";
    console.log(apiImg);

    $('#intro').css("background-image", 'url(apiImg)');
}

基本上我创建了一个新的空数组。我遍历原始数组的每个元素,看看它是否在新数组中。如果没有,我添加它,如果它已经在新数组中,那么我检查新数组以查看该id的数量是否更高,如果是,我拼接当前行。

答案 2 :(得分:0)

以下是可能的答案之一,假设 $ your_input 将您的数据包含为字符串......

方法1

<?php
$your_input=preg_replace('#\s*\{\s*id\s*:\s*([^,]+?),\s*qty\s*:\s*([^,\}]+?)\s*\}\s*(,)?#','{"id":"$1","qty":"$2"}$3',$your_input);
$your_input=json_decode($your_input,true);
$result=[];
foreach($your_input as $a) 
if (!array_key_exists($a['id'],$result) or $a['qty']<$result[$a['id']]['qty'])
{
$result[$a['id']]['id']=$a['id'];
$result[$a['id']]['qty']=$a['qty'];
}
$result=json_encode(array_values($result),JSON_PRETTY_PRINT);
echo '<pre>';
print_r($result);

方法2

<?php
$your_input=str_replace(['        ',':'],['"','":'],$your_input);
$your_input=json_decode($your_input,true);
usort($your_input,function($a,$b){return $a['qty']==$b['qty']?0:($a['qty']>$b['qty']?-1:1);});
foreach($your_input as $b) $result[$b['id']]=['id'=>$b['id'],'qty'=>$b['qty']];
$result=json_encode(array_values($result),JSON_PRETTY_PRINT);
echo '<pre>';
print_r($result);

在方法1或方法2之后, $ result 变量应包含以下数据字符串...

[
    {
        "id": 1,
        "qty": 190
    },
    {
        "id": 2,
        "qty": 10
    }
]