Php 如何显示具有两个条件的数组的唯一结果

Php 如何显示具有两个条件的数组的唯一结果,php,arrays,database,unique,Php,Arrays,Database,Unique,在$data中,我有以下值: 结果 [{“id”:2,“作者”:example@mail.com“,”id_orders“:502}, {“id”:2,“作者”:example@mail.com“,”id_orders“:503}, {“id”:2,“作者”:example@mail.com“,”id_orders“:505}, {“id”:3,“作者”:“第二”-example@mail.com“,”id_orders“:502}, {“id”:3,“作者”:“第二”-example@mail

$data
中,我有以下值:

结果

[{“id”:2,“作者”:example@mail.com“,”id_orders“:502},
{“id”:2,“作者”:example@mail.com“,”id_orders“:503},
{“id”:2,“作者”:example@mail.com“,”id_orders“:505},
{“id”:3,“作者”:“第二”-example@mail.com“,”id_orders“:502},
{“id”:3,“作者”:“第二”-example@mail.com“,”id_orders“:503},
{“id”:3,“作者”:“第二”-example@mail.com“,”id_orders“:505},
{“id”:4,“作者”:“第三”-example@mail.com“,”id_orders“:502},
{“id”:4,“作者”:“第三”-example@mail.com“,”id_orders“:503},
{“id”:4,“作者”:“第三”-example@mail.com“,”id_orders“:505}]
我想要
id
id\u订单的唯一结果。我想要这9个结果中的3个。我已经试过了,但它在一个
id\u订单
条件下有帮助

PHP代码

$result=json\u decode($data,true);
$unique_array=[];
foreach($result作为$element){
$hash=$element['id_orders'];
$unique_数组[$hash]=$element;
}
$data=数组\值($unique\数组);

你知道让它在两个人身上工作会有什么不同吗?

你可以通过跟踪已经使用的值来做到这一点。免责声明:此解决方案仅在两个标准的唯一值数量相同的情况下产生明确的结果

$uniqueArray=[];
$UsedValue=[
“id”=>[],
“id_订单”=>[],
];
foreach($result作为$element){
如果(!in_数组($element['id'],$usedValues['id'])和&!in_数组($element['id_orders'],$usedValues['id_orders')){
$uniqueArray[]=$element;
$usedValues['id'][=$element['id'];
$usedvalue['id\u orders'][=$element['id\u orders'];
}
}
基本上,这里发生的事情是,我们使用
$usedValues
来存储我们已经使用过的所有唯一值,并使用数组中的
与之进行比较。当我们迭代对象时,任何具有
id
id\u orders
的对象都将被跳过。将按阵列中出现的顺序进行配对

我已经付出了额外的努力,试图使这段代码更加通用:

*在给定键下查找具有唯一值组合的元素。
*
*假设数组中的所有元素都是数组本身,并且
*子阵列具有相同的结构。假设子阵列元素不存在
*对象(使用严格比较)。
*/
函数唯一组合(数组$arrayToFilter,数组$KeyStoreOn):数组
{
if(空($arrayToFilter)| |空($keysToFilterOn)){
抛出新\InvalidArgumentException(
'唯一组合的参数不能为空数组'
);
}
//从第一个元素获取键;其他元素假定相同
$keysOfElements=数组_键(重置($arrayToFilter));
$keyspresenteath=array_intersect($keysToFilterOn,$keysOfElements);
//如果没有一个键被激活,那么运行算法就没有意义
//实际上在数组元素中找到
如果(为空($同时为空)){
返回[];
}
$result=[];
$usedValues=数组\组合(
美元,两者都有,
数组_填充(0,计数($keyspresententtwith),[])
);
foreach($arrayToFilter作为$element){
如果(!isAlreadyUsed($UsedValue,$element)){
$result[]=$element;
foreach($keyspresentation和$keyToUse){
$usedvalue[$keyToUse][]=$element[$keyToUse];
}
}
}
返回$result;
}
函数isAlreadyUsed(数组$usedvalue,数组$element):bool
{
foreach($usedValue为$usedKey=>$usedValue){
if(在数组中($element[$usedKey],$usedValue)){
返回true;
}
}
返回false;
}
在其核心,这是相同的算法,但动态。它允许对不同数量的键进行筛选(这就是它们作为参数单独传递的原因),因此动态创建
$usedValues
数组(使用第一个元素的键作为自己的键,填充为空数组),并且必须在循环中对所有键进行比较(因此使用单独的函数检查元素的值是否已被使用)


它可能在这里或那里被调整,因为我还没有彻底地测试过它,但是应该为大多数结构提供满意的结果。

不清楚你在寻找什么,或者<代码> ID'Evestux[/Cuff] >与你所提出的数组有关。你能指定你认为是“ID和IDL命令的唯一结果”吗?抱歉,更正。感谢您的关注。我想从这个结果中得到3个结果:{“id”:2,“id_顺序”:502},{“id”:3,“id_顺序”:503},{“id”:4,“id_顺序”:505}。这样配对似乎是任意选择。如果唯一值的数量不匹配,情况会怎样(例如,3个不同的ID,但4个不同的订单ID,反之亦然)?我希望是这样。正因为如此,我解决了我以前在
id\u event\u users
示例中的唯一性问题:这里是相同的,但它是关于
id\u orders
。现在我有了不同的
id\u orders
,但结果太多,我需要条件。因此算法将是
id
ge的第一个唯一外观ts与第一个独特的
id\u订单
配对,第二个
id
与第二个
id\u订单
配对,依此类推?谢谢!