【问题标题】:PHP filter through array of objects and return new array of objects, while removing duplicates based on one propertyPHP 过滤对象数组并返回新的对象数组,同时基于一个属性删除重复项
【发布时间】: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 已经应用。

标签: php arrays laravel api filter


【解决方案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'); 
    ?> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      相关资源
      最近更新 更多