Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用重复记录遍历PHP数组并删除一个值为0的记录_Php_Mysql_Sql_Arrays_Laravel - Fatal编程技术网

使用重复记录遍历PHP数组并删除一个值为0的记录

使用重复记录遍历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的记录,因为

我有一个使用Laravel的MySQL查询,我将其转换为PHP数组

行的值与此类似:

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函数应该做什么?选择此作为答案,因为它解决了我的问题,而其他函数没有。