2017-06-01 3 views
0

Ich habe ein Array mit Elementen, jedes Element hat eine duration und eine price.Filterarray basierend auf anderen Einträgen in demselben Array

Ich möchte die Duplikate duration Werte basierend auf dem price Wert herausfiltern - halten die niedrigste.

Array:

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

Ich verwende Laravel als Rahmen, so dass ich bin in der Lage, die Sammlung-Methoden zu verwenden.

So, jetzt erreiche ich dies wie folgt:

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

Aber das fühlt sich ein wenig lückenhaft ...

Antwort

0

Was für ein

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

Es sollte funktioniert auch als

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

Ich benutze Laravel nicht, sondern auf das, was ich in der Bedienungsanleitung zu lesen, scheint Simones zweite Methode die beste 'collection' Ansatz. Es sortiert ASC und unique() behält die ersten Vorkommen. – mickmackusa

1

Dieser den Trick tun:

$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); 

Ausgang:

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