PHP 过滤对象数组并返回新的对象数组,同时基于一个属性删除重复项
Posted
技术标签:
【中文标题】PHP 过滤对象数组并返回新的对象数组,同时基于一个属性删除重复项【英文标题】:PHP filter through array of objects and return new array of objects, while removing duplicates based on one property 【发布时间】:2018-07-29 18:52:46 【问题描述】:我有这个由 8k 左右的对象组成的数组,它们都有一个属性 phase
,我正在尝试过滤掉重复的阶段。我正在尝试使用array_unique
,但我似乎无法做到这一点。这是对象的 sn-p:
array [
0 => #525
"street_address1": "Some St. 1"
"street_address2": null
"phase": "101"
"sales_rep": "164"
"id": "abd90d6b-28a8-2be6-d6c1-abd9007aef38"
"name": "48TH ST E"
"block_minimum": 400
"block_maximum": 498
"side": 2
1 => #527
"street_address1": "Some St. 2"
"street_address2": null
"phase": "101"
"sales_rep": "164"
"id": "abd90d6b-28a8-2be6-d6c1-abd9007aef38"
"name": "48TH ST E"
"block_minimum": 401
"block_maximum": 499
"side": 1
2 => #580
"street_address1": "Some St. 3"
"street_address2": null
"phase": "103"
"sales_rep": "164"
"id": "a1d58c9c-6ba7-ebc6-8a74-a1d5806e0bcf"
"name": "11TH AVE S"
"block_minimum": 4700
"block_maximum": 4798
"side": 2
3 => #528
"street_address1": "Some St. 4"
"street_address2": null
"phase": "103"
"sales_rep": "164"
"id": "a1d58c9c-6ba7-ebc6-8a74-a1d5806e0bcf"
"name": "11TH AVE S"
"block_minimum": 4700
"block_maximum": 4798
"side": 2
]
这将用于后端 api GET 返回。我有一个方法可以从数据库中获取所有地址,然后需要过滤并只返回唯一的阶段。我还要补充一点,我正在使用 Laravel 5.4,尽管我没有看到任何可以帮助我的助手。
【问题讨论】:
你使用 Eloquent 吗?如果它找到多个具有相同短语的地址,返回哪个地址是否重要? 我正在使用 eloquent,尽管这种特殊的方法是一个原始查询。这并不重要,因为我只是想列出所有基于特定 id 的独特阶段,该 id 已经应用。 【参考方案1】:看看https://laravel.com/docs/5.5/collections#method-unique,如果你不能在查询生成器中过滤,这似乎是你需要过滤的。但是,如果您可以在查询构建器期间执行此操作会更有效,因为您不需要处理那些 8k 行。
【讨论】:
【参考方案2】:好的,我得到了这个工作,它非常适合我。感谢大家!
$phases = array();
foreach ($salesRepAddresses as $address)
$phases[] = $address->phase;
$uniquePhases = array_unique($phases);
return $uniquePhases;
【讨论】:
啊,我想我误读了你的问题。我以为你想返回地址,但它们都不应该具有相同的相位。好吧,至少我帮助您了解了 array_unique 函数。 ;)【参考方案3】:您需要使用array_column
收集所有阶段然后array_unique
试试这个:
$phases = array_column($array, 'phase');
$uniquePhases = array_unique($phases);
【讨论】:
这将返回一个空数组。 @MattLarson$phases
或 $uniquePhases
是哪一个?
$phases 是空的,然后 $uniquePhases 显然也是空的。也许是对象嵌套的方式?
或者您应该将您的地址加载到$array
变量中;)
但更严肃的一点是,这个解决方案不会让你有任何帮助,它根本不适用于你的问题..【参考方案4】:
在php.net manual for array_unique() 的评论部分,有一个您想要的示例。如果您不理解它,或者它不起作用,请询问;)
为任何单个键索引创建唯一的多维数组。例如我 想要为特定代码创建多维唯一数组
代码:我的数组是这样的,
<?php
$details = array(
0 => array("id"=>"1", "name"=>"Mike", "num"=>"9876543210"),
1 => array("id"=>"2", "name"=>"Carissa", "num"=>"08548596258"),
2 => array("id"=>"1", "name"=>"Mathew", "num"=>"784581254"),
);
?>
您可以使其对任何字段(例如 id、name 或 num)都是唯一的。
我已经为此开发了这个功能:
<?php
function unique_multidim_array($array, $key)
$temp_array = array();
$i = 0;
$key_array = array();
foreach($array as $val)
if (!in_array($val[$key], $key_array))
$key_array[$i] = $val[$key];
$temp_array[$i] = $val;
$i++;
return $temp_array;
?>
现在,在您的代码中任意位置调用此函数,
类似的,
<?php
$details = unique_multidim_array($details,'id');
?>
【讨论】:
以上是关于PHP 过滤对象数组并返回新的对象数组,同时基于一个属性删除重复项的主要内容,如果未能解决你的问题,请参考以下文章