2015-10-06 181 views
1

我有一個PHP數組,看起來像這樣:PHP比較陣列結果和過濾

Array(
[3086] => Array 
    (
     [id] => 3086 
     [note] => Make text larger 
     [revision] => 1 
     [noteParentId] => 1706 
    ) 

[3087] => Array 
    (
     [id] => 3087 
     [note] => Make text larger 
     [revision] => 2 
     [noteParentId] => 1706 
    ) 

[3085] => Array 
    (
     [id] => 3085 
     [note] => Enlarge this image 
     [revision] => 1 
     [noteParentId] => 1705 
    ) 

[3084] => Array 
    (
     [id] => 3086 
     [note] => Another test note 
     [revision] => 1 
     [noteParentId] => 1704 
    ) 

) 

我怎麼能以這樣的方式將其過濾,如果[noteParentId]具有相同的值(如圖[3086][3087] ),然後刪除數組中較低的[revision]值的那個?

回答

1

這個答案將需要比以前的答案多一點代碼,但我認爲這是一個更有效的解決方案,原因如下:

  • 它將永遠是您的O(n)解決方案
  • 它保持您期望的相同數據結構
  • 它不會要求您合併多個過濾的結果集。併合並數據。

這些例子////

function filterOldRevisions($tasks) { 

    $revisionHash = array(); 

    foreach ($tasks as $taskId => $task) { 
     if (isset($revisionHash[$task['noteParentId']])) { 
      $currentMaxRevision = $revisionHash[$task['noteParentId']]; 

      if ($task['revision'] > $revisionHash[$task['noteParentId']]) { 
       //store the max revision for the parent in the hash 
       $previousMaxId = $revisionHash[$task['noteParentId']]['id']; 
       $revisionHash[$task['parentId']] = $task; 

       //remove the previous max revision 
       unset($tasks[$previousMaxId]); 
      } else { 
       //remove lower revision 
       unset($tasks[$taskId]); 
      } 
     } else { 
      //always store the first task 
      $revisionHash[$task['noteParentId']] = $task; 
     } 
    } 

    return $tasks; 
} 
1

可以使用array_filter功能http://php.net/manual/en/function.array-filter.php

例如:

$parentId = 1706; 
$filtered = array_filter($data, function($item) use ($parentId) { 
    return $item['noteParentId'] === $parentId; 
}); 

,或者如果你修改SQL查詢,您可以通過計數通過和過濾器中使用組(PARENT_ID)> 1

例如:

SELECT noteParentId, count(*) FROM someTable GROUP BY noteParentId WHERE count(*) > 1; 
+1

兩者都是錯誤的。第一個只返回數組,其中'noteParentId'與您想要的相同,第二個將只返回有多個版本的行。 –

+0

謝謝你指出羅比。如果行具有匹配的'noteParentId',那麼我想保留這些行中具有最高'revision'的行,並且保留所有其他條目具有不同的noteParentId's。 – jmchauv

2

您應該對數組排序

function mysort($a, $b){ 
    if ($a['revision'] >= $b['revision']) 
     return 1; 
    return -1; 
} 

,然後存儲在另一個陣列

$arrResult = array(); 
usort($arrTest, "mysort"); 
foreach ($arrTest as $key=>$value){ 
    if (!isset($arrResult[$value['noteParentId']])) 
     $arrResult[$value['noteParentId']] = array($key=>$value); 
} 

現在你需要消毒$ arrResult匹配值...