2013-11-22 57 views
0

我正在處理一個我想過濾的數組,因此它只包含每個鍵的最低價格。所以50只會有一個單位,與100一樣,並且該單位將是最低的價格。以最低價格過濾多維數組

這裏是我工作的一個例子:

Array 
(
    [50] => Array 
     (
      [41788] => Array 
       (
        [StdRate] => 231.0000 
        [UnitName] => NN23 
       ) 

      [46238] => Array 
       (
        [StdRate] => 303.0000 
        [UnitName] => 1038 
       ) 

      [46207] => Array 
       (
        [StdRate] => 303.0000 
        [UnitName] => 1007 
       ) 
     ) 
    [100] => Array 
     (
      [41570] => Array 
       (
        [StdRate] => 299.0000 
        [UnitName] => HH18 
       ) 

      [46214] => Array 
       (
        [StdRate] => 388.0000 
        [UnitName] => 1014 
       ) 
     ) 
) 

我想避免與複雜的foreach循環這樣做,所以我想我array_filter將是很好的,但有一個很難包裝我圍着它轉。或者foreach是最好的?

$filtered = array_filter($units, function($a) { 

}); 
+0

是否有一個原因,你不能把所有這些元素連接成一個陣列(值即是),然後使用'ASORT()'? – Crackertastic

+0

知道什麼更好的最好方法是基準。試試看看你自己:) – Babblo

+0

Crackertastic,我真的不需要排序。我只想移除除最低價格單位外的所有單位。 – dallen

回答

1

這是一個函數,將通過你的多維數組並獲取最低單位。它將保留大陣(50,100)的關鍵和它抓住的單位(41788,41570)的關鍵。它不會保留相同低利率的多個值。在這些情況下,它會返回找到的最低值的第一個值。可能不完全是你想要的,但它應該是一個好開始,你可以隨時修改它。它使用嵌套的foreach完成工作。

希望這能幫到你!

function findLows($big) { 
    $lowUnits = array(); 
    foreach($big as $id => $array) { 
     $low = false; 
     $prev = false; 
     foreach($array as $k => $a) { 
      if(!$low) { 
       $low = $k; 
       $prev = $a['StdRate']; 
      } else { 
       if($a['StdRate'] < $prev) { 
        $prev = $a['StdRate']; 
        $low = $k; 
       } 
      } 
     } 
     $lowUnits[$id] = array($low => $array[$low]); 
    } 
    return $lowUnits; 
} 

$bigArray = array(); 
$bigArray[50][41788] = array('StdRate' => 231.0000, 'UnitName' => "NN23"); 
$bigArray[50][46238] = array('StdRate' => 303.0000, 'UnitName' => "1038"); 
$bigArray[50][46207] = array('StdRate' => 303.0000, 'UnitName' => "1007"); 
$bigArray[100][41570] = array('StdRate' => 299.0000, 'UnitName' => "HH18"); 
$bigArray[100][46214] = array('StdRate' => 388.0000, 'UnitName' => "1014"); 

$filtered = findLows($bigArray); 

var_dump($filtered); 

會產生:

array(2) { 
    [50]=> 
    array(1) { 
    [41788]=> 
    array(2) { 
     ["StdRate"]=> 
     float(231) 
     ["UnitName"]=> 
     string(4) "NN23" 
    } 
    } 
    [100]=> 
    array(1) { 
    [41570]=> 
    array(2) { 
     ["StdRate"]=> 
     float(299) 
     ["UnitName"]=> 
     string(4) "HH18" 
    } 
    } 
} 
+0

謝謝你親切的先生/女士!這是太棒了。 – dallen

+0

沒問題,這種先生很樂意幫忙:-) – Crackertastic