PHP比较数组结果和过滤器
我有一个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
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的所有其他条目。