使用重复记录遍历PHP数组并删除一个值为0的记录
我有一个使用Laravel的MySQL查询,我将其转换为PHP数组 行的值与此类似:使用重复记录遍历PHP数组并删除一个值为0的记录,php,mysql,sql,arrays,laravel,Php,Mysql,Sql,Arrays,Laravel,我有一个使用Laravel的MySQL查询,我将其转换为PHP数组 行的值与此类似: name | override | percentage Eclipse | 1 | 50% Eclipse | 0 | 75% MySQL查询 从表中选择* 实际上,这两行都有相同的名称,但其中一行的覆盖设置为0,另一行的覆盖设置为1 如何删除查询结果PHP数组中的所有记录,这些记录是由名称确定的重复记录,并且覆盖设置为0?我只想要用我已经做过的新记录覆盖的记录,但是我需要一种方法来删除覆盖为0的记录,因为
name | override | percentage
Eclipse | 1 | 50%
Eclipse | 0 | 75%
MySQL查询
从表中选择*
实际上,这两行都有相同的名称,但其中一行的覆盖设置为0,另一行的覆盖设置为1
如何删除查询结果PHP数组中的所有记录,这些记录是由名称确定的重复记录,并且覆盖设置为0?我只想要用我已经做过的新记录覆盖的记录,但是我需要一种方法来删除覆盖为0的记录,因为这些记录是相同的,但具有不同的百分比值
如何做到这一点
谢谢。尝试以下查询
SELECT * from testtable GROUP BY `name` HAVING count(`name`) = 1 OR `override` = 1;
检查此项注意:在SQL中执行此操作将更快,并且使用的内存也要少得多。如果由于某种原因无法修改SQL,我只会尝试这种PHP方法 也许试试。。。点击数据库两次,第一次只获取非覆盖,第二次获取覆盖-强制按名称索引数组并合并它们。在给定数组和副本数量的情况下使用相当大的内存块,但这很容易理解并保持简单
$initial = get_non_overridden();
$override = get_overridden();
$init_indexed = index_by_name($initial);
$over_indexed = index_by_name($override);
$desired_result = array_merge($init_indexed, $over_indexed);
假设数据库为您提供了一个标准行集行数组,其中每一行都是字段->值的散列。我们想要的是这样的东西:
[
'Eclipse' => [
'name' => 'Eclipse',
'override' => '0',
'percentage' => '75%'
],
'Something' => [
'name' => 'Something',
'override' => '0',
'percentage' => '20%'
],
]
因此,按名称索引将是:
function index_by_name($rowset) {
$result = array();
foreach ($rowset as $row) {
$result[ $row['name'] ] = $row;
}
return $result;
}
有很多方法可以调整内存或运行时的效率,但这正是我所想的要点
array_merge然后用被覆盖的数组覆盖初始数组
注意:所有这些都假设只有一行Eclipse覆盖为1。如果你有二十次食0和一次食1,这就行了,如果你有两次食1,你只能看到其中一次。。。没有办法说是哪一个。如果我正确理解您的需求,您需要筛选出具有重复名称且覆盖=0的记录 如果按名称对结果集进行排序,则可以使用此函数
function removeDuplicatesFromArray($rows) {
$result = array();
$old_name = '';
foreach($rows as $row) {
if($row['name'] != $old_name) {
$result[] = $row;
$old_name = $row['name'];
}
elseif($row['override'] == 1) {
array_pop($result);
$result[] = $row;
}
}
return $result;
}
为什么不直接在MySQL查询中执行呢?通过这种方式,您就可以在PHPHow中获得良好的结果。我可以在MySQL中执行此操作吗?考虑到复杂性,我认为这需要一些数组操作来完成。请使用您当前的MySQL更新您的问题query@JustinIurman好了,搞定了。实际上它要大得多。该查询大约有10个联接,正在选择数百条记录。我只是用上面的例子。这是相同的概念,但我只是提供了上面的列行来简化解释。这只是显示覆盖率为1的记录。请检查SQLFIDLE,它还显示覆盖率为0的记录,secound records Notepad one has override=0确定我看到我已将此添加到我的查询中,现在它不会返回任何名称重复的记录。你的意思是,如果Eclipse有3条记录,一条覆盖率为1,两条覆盖率为0,然后返回2条记录,一条覆盖率为1,一条覆盖率为0,而不是3条记录?在这种情况下,你应该将原始查询放在这里,因为您可以检查sqlfiddle,它在那里工作意味着它也应该对您工作,如果它不工作,那么这意味着您正在测试的查询中有问题index_by_name函数应该做什么?选择此作为答案,因为它解决了我的问题,而其他函数没有。