PHP比较数组结果和过滤器

PHP比较数组结果和过滤器,php,arrays,Php,Arrays,我有一个php数组,如下所示: Array( [3086] => Array ( [id] => 3086 [note] => Make text larger [revision] => 1 [noteParentId] => 1706 ) [3087] => Array ( [id] => 3087 [note] => Ma

我有一个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]
值的数组?

您可以使用array\u filter函数

例如:

$parentId = 1706;
$filtered = array_filter($data, function($item) use ($parentId) { 
   return $item['noteParentId'] === $parentId; 
});
SELECT noteParentId, count(*) FROM someTable GROUP BY noteParentId WHERE count(*) > 1;
或者,如果修改sql查询,可以使用group by和filter by count(parent_id)>1

例如:

$parentId = 1706;
$filtered = array_filter($data, function($item) use ($parentId) { 
   return $item['noteParentId'] === $parentId; 
});
SELECT noteParentId, count(*) FROM someTable GROUP BY noteParentId WHERE count(*) > 1;

您可以使用array_filter函数

例如:

$parentId = 1706;
$filtered = array_filter($data, function($item) use ($parentId) { 
   return $item['noteParentId'] === $parentId; 
});
SELECT noteParentId, count(*) FROM someTable GROUP BY noteParentId WHERE count(*) > 1;
或者,如果修改sql查询,可以使用group by和filter by count(parent_id)>1

例如:

$parentId = 1706;
$filtered = array_filter($data, function($item) use ($parentId) { 
   return $item['noteParentId'] === $parentId; 
});
SELECT noteParentId, count(*) FROM someTable GROUP BY noteParentId WHERE count(*) > 1;

您应该对数组进行排序

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

现在您需要清理$arresult…

您应该对数组进行排序

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

现在您需要清理$arresult…

此答案需要比前面的答案多一点代码,但我认为这是一个更有效的解决方案,原因如下:

  • 这对你来说永远是一个O(n)解决方案
  • 它保持与您期望的相同的数据结构
  • 它不需要您合并多个过滤结果集。以及数据的合并
////


与前面的答案相比,这个答案需要更多的代码,但我认为这是一个更有效的解决方案,原因如下:

  • 这对你来说永远是一个O(n)解决方案
  • 它保持与您期望的相同的数据结构
  • 它不需要您合并多个过滤结果集。以及数据的合并
////


这两个例子都是错误的。第一个将只返回
noteParentId
与您所需相同的数组,第二个将只返回包含多个修订的行。感谢您指出这一点Robbie。如果行具有匹配的
noteParentId
,则我希望保留这些行中
版本最高的行,以及所有其他具有不同noteParentId的条目。这两个示例都是错误的。第一个将只返回
noteParentId
与您所需相同的数组,第二个将只返回包含多个修订的行。感谢您指出这一点Robbie。如果行具有匹配的
noteParentId
,则我希望保留这些行中具有最高
revision
的行,以及保留具有不同noteParentId的所有其他条目。