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 过滤对象数组并返回新的对象数组,同时基于一个属性删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

同时映射和过滤数组

php数组的重复值如何过滤掉

filter 对已知数组进行筛选,返回为true的元素或对象并组成一个新数组

Angular2使用管道基于对象数组过滤对象数组

js过滤数组中都为空的对象几种方式

数组对象去重