【问题标题】:Trying to remove duplicate lines from array acc. to column contents试图从数组 acc 中删除重复的行。到列内容
【发布时间】:2014-11-10 18:49:40
【问题描述】:

使用 PHP 并从 DB 进行 SELECT 查询我得到了一个我不喜欢的输出。

我是这样开始的:

$details = Db::getInstance()->executeS($sql);

我得到了,经过一个

echo json_encode($details);

出于调试目的:

[{"email":"test@on.gr","lastname":"TEST","firstname":"TEST1","id_lang":"1","id_order":"1"}]   
[{"email":"test@on.gr","lastname":"OTHER","firstname":"DIFFERENT","id_lang":"1","id_order":"2"}]
[{"email":"test@on.gr","lastname":"THIRD","firstname":"DIFFERENT","id_lang":"1","id_order":"3"}]
[{"email":"new@on.gr","lastname":"THIRD","firstname":"NEW","id_lang":"1","id_order":"4"}]

我想要的是转换数组$details 以检查每个“行”是否电子邮件列在整个输出中具有唯一值。如果是,则删除包含重复条目的行并仅保留包含它的第一行。

期望的输出

[{"email":"test@on.gr","lastname":"TEST","firstname":"TEST1","id_lang":"1","id_order":"1"}]
[{"email":"new@on.gr","lastname":"THIRD","firstname":"NEW","id_lang":"1","id_order":"4"}]

(如您所见,id order 2 和 3 的行已被删除,因为它们与第一个具有相同的电子邮件)

我们将不胜感激任何形式的帮助。

【问题讨论】:

    标签: php mysql sql arrays duplicates


    【解决方案1】:

    编辑:只是想在这里补充一下,我的代码不在 PHP 中。你必须改变它。

    在 select 语句中执行 ORDER BY email 命令。 伪代码:

    遍历结果:

    String email1 = "";
    String email2 = "";
    for (i=0;i<(Detailssize); i++){
    
      email2 = details[email][i]; //Do whatever you need to do to access the value of the email key here.
      if(email2 != email1){
          KEEP IT
      }
      else{
       THROW AWAY
      }
      email1 = email2;
    
    }
    

    显然这不是 PHP。自从我编写 php 代码以来已经有一段时间了。尽管如此,从逻辑上讲,这应该仍然有效。我确信有一种方法可以将您的 SELECT 语句更改为仅从每个值返回一个,但我在 SQL 方面还不够好。这不是一个很好的解决方案,但希望它有所帮助。

    【讨论】:

    • SQL 输出($sql)没有问题,因为代码的另一部分需要整个输出。 (包括重复项)问题是,尽管我理解你的逻辑并且它可能可以工作,因为我的 php 知识低于平均水平,我永远不会在 php 中“翻译”你的代码......
    【解决方案2】:

    保留您以前看过的电子邮件列表;每当您遇到以前看过的电子邮件时,请跳过该行。

    像这样:

    $newSet = array();
    $seenBefore = array();
    foreach( $details as $row ) {
      if( isset( $seenBefore[ $row['email'] ) ) { 
        continue; // jump to the next row
      }
      // this email address must be new; add it to things we've seen before then add this row to the newSet
      $seenBefore[$row['email']] = true;
      $newSet[] = $row;
    }
    

    然后以任何你想要的方式输出 $newSet。

    【讨论】:

    • 不幸的是它不能按原样工作。 !修复了 'if( isset( $seenBefore[ $row['email'] ) ) {` with if(isset($seenBefore[$row['email']])) ] 丢失,但仍然没有乐趣。
    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    相关资源
    最近更新 更多