2013-07-15 45 views
0

我想在每個子數組中搜索數組中的重複值,如果有數據,只保留連接到這個項目的最高值。匹配子串,只保留最高值

這是我的問題,但我喜歡添加一個例子來澄清事情!

這是我的數組:

Array 
(
    [0] => Array 
     (
      [groupid] => 1 
      [points] => 5 
     ) 
    [1] => Array 
     (
      [groupid] => 1 
      [points] => 1 
     ) 
    [2] => Array 
     (
      [groupid] => 1 
      [points] => 4 
     ) 
    [3] => Array 
     (
      [groupid] => 2 
      [points] => 1 
     ) 
) 

正如你可以看到,前三個項目具有相同的groupid。我想匹配這些項目,並查看哪些項目具有最高點。另一個(具有最低點)應該被踢出陣列。

因此,在這種情況下,項目012來自同一集團,但2具有最高點。 01應該從陣列中刪除。

我期望的結果會是這樣的:

Array 
(
    [0] => Array 
     (
      [groupid] => 1 
      [points] => 5 
     ) 
    [1] => Array 
     (
      [groupid] => 2 
      [points] => 1 
     ) 
) 

我一直在努力了幾個小時,但現在還沒有運氣。也許我正在俯視一些非常簡單的事情,並且很難想出這件事......任何幫助將不勝感激!

編輯 這是一個Drupal站點(但不應該有任何區別),這是查詢:

foreach ($promotions as $value) { 
    $promo = db_query("SELECT * FROM {_promo_articles} WHERE art = :art AND promoid = :promoid", array(
     ':art'  => $value['product'][0]->sku, 
     ':promoid' => $value['promo_id'][0])) ->fetchAll(); 
} 
+2

這個信息從數據庫中來嗎?如果是這樣,那麼從數據庫中查詢可能會更容易。 – Neal

+0

天真的做法就像做一個具有唯一值的數組(值是groupids)。然後迭代該數組,並找到這個數組中每個groupid的最大值? – Fallen

+1

@Neal,是的......我也在想這個,但你會怎麼做呢? – Michiel

回答

4

當我從你的comment看到,該信息來自數據庫這樣做是這樣的:

(僞)

SELECT group_id, MAX(points) 
FROM db_table 
GROUP BY group_id; 
+0

Thx的答案,但問題是我必須查詢數據庫每次在'foreach'循環...所以我很害怕這不是一個解決方案... – Michiel

+0

@Michiel呃?你爲什麼要在'foreach'循環中查詢?只需在循環之前獲取所有數據! :-D – Neal

+0

因爲每個查詢都有不同的參數:) – Michiel

0

我會做點事荷蘭國際集團這樣的:

$final_array = array(); 
foreach($array AS $element) 
{ 
    if(!isset($final_array[$element["groupid"]]) || 
     $final_array[$element["groupid"]] < $element["points"]) 
      $final_array[$element["groupid"]] = $element["points"]; 
} 

然後,$final_array會是什麼樣子......

Array 
(
    [1] => 5 
    [2] => 1 
) 

(第1組有5分,2組有1點)

0

您可以使用usort功能按照points的順序排列您的陣列。這個功能將它順序最大到最小:

usort($myArray, function($a, $b) { 
    return $b['points'] - $a['points']; 
}); 
0

正如評論指出要做到這一點的最好辦法是從您的數據庫,如果這是一個選項。

如果不是,您可以使用array_reduce和封蓋(PHP 5.3+)

$array = array_reduce($array,function(&$result, $val){ 
         if (!array_key_exists($val["groupid"], $result){ 
          $result[$val["groupid"]] = $val;  
         } else { 
          if ($result[$val["groupid"]]["points"] < $val["points"]) 
           $result[$val["groupid"]]["points"] = $val["points"]; 
         } 
         }, array()); 

然後,如果你想重置鍵

$array = array_values($array);