现在我在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
}
]
这可能吗?
答案 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 将您的数据包含为字符串......
<?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);
<?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
}
]