【问题标题】:Filter array based on other entries in same array根据同一数组中的其他条目过滤数组
【发布时间】:2017-11-02 17:18:33
【问题描述】:

我有一个包含项目的数组,每个项目都有一个duration 和一个price

我想根据price 值过滤掉重复的duration 值 - 保持最低。

数组:

$arr = [
  [
    'duration' => 60, // this item should be filtered
    'price' => 100
  ],
  [
    'duration' => 120,
    'price' => 190
  ],
  [
    'duration' => 60, // this one should remain in array
    'price' => 75
  ]
]

我使用 Laravel 作为框架,所以我可以使用集合方法。

所以我现在实现如下:

$arr->sortByDesc('price')
  ->keyBy('duration') // duplicate entries are overwritten 
                      // with the latest/lowest value
  ->sortBy('price'); 

但这感觉有点粗略......

【问题讨论】:

    标签: php arrays laravel sorting duplicates


    【解决方案1】:

    这样就可以了:

    $arr = [
      [
        'duration' => 60, // this item should be filtered
        'price' => 100
      ],
      [
        'duration' => 120,
        'price' => 190
      ],
      [
        'duration' => 60, // this one should remain in array
        'price' => 75
      ]
    ];
    
    rsort($arr);   // sort the subarrays by duration DESC
    // assign keys to each subarray using duration value
    $arr=array_values(array_combine(array_column($arr,'duration'),$arr));
    // this overwrites more expensive subarrays with less expensive subarrays
    var_export($arr);
    

    输出:

    array (
      0 => 
      array (
        'duration' => 120,
        'price' => 190,
      ),
      1 => 
      array (
        'duration' => 60,
        'price' => 75,
      ),
    )
    

    【讨论】:

      【解决方案2】:

      怎么样

      $collection = collect($arr);
      $filtered = $collection->sortBy('duration')->sortBy('price')->unique('duration');
      

      它应该也可以作为

      $collection = collect($arr);
      $filtered = $collection->sortBy('price')->unique('duration');
      

      【讨论】:

      • 我不使用 Laravel,但根据我在手册中阅读的内容,Simone 的第二种方法似乎是最好的 collection 方法。它对 ASC 进行排序,并且 unique() 保留第一次出现。
      猜你喜欢
      • 2017-02-07
      • 2019-02-13
      • 2021-03-21
      • 2013-10-08
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      相关资源
      最近更新 更多