使用重复记录迭代PHP数组并删除值为0的一条记录

时间:2014-08-28 21:53:46

标签: php mysql sql arrays laravel

我使用Laravel进行MySQL查询,转换为PHP数组。

行的值与此类似:

name | override | percentage
Eclipse | 1 | 50%
Eclipse | 0 | 75%

MySQL查询

select * from table

这两行(它实际上只有2个)具有相同的名称,但是一个将覆盖设置为0,一个设置为1.

如何摆脱查询结果(PHP数组)中所有重复的记录(由名称确定)并将覆盖设置为0?我只想要使用我已经完成的新记录覆盖的记录,但是我需要一种方法来删除覆盖= 0的记录,因为记录是相同的但具有不同的百分比值。

如何做到这一点?

感谢。

3 个答案:

答案 0 :(得分:1)

尝试以下查询,

SELECT * from testtable GROUP BY `name` HAVING count(`name`) = 1 OR `override` = 1;

检查此sqlfiddle

答案 1 :(得分:1)

如果我理解您的需求,您需要过滤掉名称重复且override = 0的记录。

如果按nameSELECT * FROM TABLE ORDER BY name)对结果集进行排序,则可以使用此功能。

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

答案 2 :(得分:0)

注意:在SQL中执行此操作将更快地运行并且使用更少的内存。如果由于某种原因无法修改SQL,我只会尝试这种PHP方法。

也许试试......点击数据库两次,第一次只获取非覆盖,然后在第二次传递中获取覆盖 - 强制您的数组按名称和array_merge索引。 (考虑到数组和副本的数量,使用相当大的内存块 - 但它很容易理解并保持简单。

$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%'
  ],
]

因此index_by_name将是:

function index_by_name($rowset) {
  $result = array();
  foreach ($rowset as $row) {
    $result[ $row['name'] ] = $row;
  }
  return $result;
}

有很多方法可以在内存或运行时调整你的效率,但这就是我的想法。

array_merge然后用覆盖的那些覆盖初始的。

注意:这一切都假设只有一行Eclipse覆盖为1.如果你有二十个Eclipse | 0和一个Eclipse | 1,这将有效,如果你有两个Eclipse | 1你只能看到一个他们......并且没有办法说出哪一个。