【问题标题】:How to find duplicate array values from PDO fetchall?如何从 PDO fetchall 中查找重复的数组值?
【发布时间】:2021-02-04 16:36:13
【问题描述】:

我正在为我们公司的 Intranet 网站制作报告仪表板。下面的功能是从一个表中选择所有的工作和后缀。我正在使用 PDO fetchall 来检索我的结果。数组看起来像:

Array
( 
    [0] => Array 
    ( 
        [JOB] => 197182 
        [SUFFIX] => 002 
    ) 
    [1] => Array 
    ( 
        [JOB] => M03001 
        [SUFFIX] => 001 
    ) 
    [2] => Array 
    ( 
        [JOB] => 197182 
        [SUFFIX] => 002 
    )
)

在这种情况下,仪表板应该有 2 行,每个作业 1 行(不包括重复的)但是我如何搜索这个数组并让它只返回 2 而不是 3 的行数?由于有重复的作业和后缀,我不想创建具有相同作业后缀的第三行,所以它应该只有两行。

function row_count() 
{
    $conn = new PDO('odbc:GLOBALTST');
    $result = $conn->prepare('SELECT JOB, SUFFIX FROM JOBS_IN_PROCESS_G');
    $result->execute();
    $row = $result->fetchall(PDO::FETCH_ASSOC);
    global $count;
    $count = count($row);\\ if I print this out I get 3
}

【问题讨论】:

  • array_unique() ?
  • @Jaquarh per the php documentation on array_unique 此函数不适用于多维数组。
  • 在这种情况下,一个简单的循环和未设置的跟踪重复就足够了。但是依靠你的数据层来处理它可能会更好,如果它可能是一个反复出现的主题,你也可以为它创建一个视图。
  • 为什么不在 SQL 中执行计数?

标签: php pdo


【解决方案1】:

您可以通过选择 JOBSUFFIX 列的 DISTINCT 行来解决此问题,如下所示,

$result = $conn->prepare('SELECT DISTINCT JOB, SUFFIX FROM JOBS_IN_PROCESS_G');

OR如果你想在从表中选择行后在 PHP 端检查这个example但我更喜欢第一个,因为最好只得到你需要的来自数据库表。

【讨论】:

  • 我支持它应该在数据库端完成的想法。一个好的经验法则是不要要求超出您的需要。
【解决方案2】:

您也可以使用array_column 在 PHP 中执行此操作。 See it working over at 3v4l.org.

$unDuplicated = array_combine(array_column(($rows = $result->fetchall(PDO::FETCH_ASSOC)), 'SUFFIX'), $rows);

如果您想保留订单,请使用array_reverse

【讨论】:

    猜你喜欢
    • 2014-05-01
    • 2013-08-20
    • 2017-08-16
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 2011-11-19
    • 2014-11-23
    • 2011-08-28
    相关资源
    最近更新 更多