2013-10-09 24 views
0

這是一個類似的問題this one,但略有不同,我發現迄今沒有答案。 看看這個:如何從PHP中的多維數組中刪除重複的值與自定義條件

Array 
(
    [0] => Array 
    (
     ['id'] => abc 
     ['value'] => XXX 
    ) 

    [1] => Array 
    (
     ['id'] => abc 
     ['value'] => ooo 
    ) 

    [2] => Array 
    (
     ['id'] => abc 
     ['value'] => qqq 
    ) 

    [3] => Array 
    (
     ['id'] => ghi 
     ['value'] => YYY 
    ) 

    [4] => Array 
    (
     ['id'] => ghi 
     ['value'] => jkl 
    ) 

    [5] => Array 
    (
     ['id'] => ghi 
     ['value'] => XXX 
    ) 

    [6] => Array 
    (
     ['id'] => mno 
     ['value'] => pql 
    ) 
) 

我想,以確定2-d陣列的所有重複值,並用自定義條件uasort刪除它們,例如。

例如採取的第一個3種元素[0],[1],[2]:

我想要XXX戰勝其他的,所以[1]和[2]將被移除,

與[3],[4]和[5]相同:它們具有相同的ID,但YYY勝過XXX和其他值。

由於從DBMS檢索這些數據,一個替代我是讓N個不同的查詢傳遞一個查詢ID,以排除, 如:「

  1. 查找與YYY所有元素
  2. 找到XXX的所有元素,但還沒有被發現已經在尋找YYY
  3. 查找有沒有同時尋找YYY或XXX被發現已經沒有YYY和XXX的所有元素。

任何幫助將不勝感激,希望這一切都可以理解。

Linuxatico

回答

1

這是很難給出一個有效的解決方案不知道您的自定義條件多麼複雜。如果你知道,可以預先定義它們,那麼你可以做一些簡單的:

// Your custom conditions 
$master = array('abc' => array('XXX'), 'ghi' => array('YYY')); 

// $dups = the array in your post 

// Group by values 
$values = array(); 
foreach ($dups as $k => $v) { 
    if (is_array($v) && isset($v['id'])) { 
     $values[$v['id']][$k] = $v['value']; 
    } 
} 

// If master values exists, use it, otherwise use value given 
$deduped = array(); 
foreach ($values as $k => $v) { 
    if (isset($master[$k])) { 
     $deduped[key($v)] = array('id' => $k, 'value' => array_shift(array_intersect($master[$k], $v))); 
    } else { 
     $deduped[key($v)] = array('id' => $k, 'value' => array_shift($v)); 
    } 
} 

,讓你...

Array 
(
    [0] => Array 
     (
      [id] => abc 
      [value] => XXX 
     ) 

    [3] => Array 
     (
      [id] => ghi 
      [value] => YYY 
     ) 

    [6] => Array 
     (
      [id] => mno 
      [value] => pql 
     ) 

) 

在PHP循環可以在許多比MySQL更快情況,因此您需要使用實際數據進行測試,以查看循環是否比單獨的查詢更快。

+0

您的解決方案確實是正確的,我正在研究您掌握這些內置php函數的方式,這非常有趣。 謝謝。 也許我會更新與基準PHP與SQL排序的問題 – linuxatico