Php 数组_unique只返回一条记录

Php 数组_unique只返回一条记录,php,array-unique,Php,Array Unique,在下面的代码中: $sth = $dbh->query('SELECT DISTINCT title,courseId,location from training'); $sth->setFetchMode(PDO::FETCH_ASSOC); $results = $sth->fetchAll(); $uu = array_unique($results); echo "<pre>"; print_r($uu); echo "</pre>";

在下面的代码中:

$sth = $dbh->query('SELECT DISTINCT title,courseId,location from training');  
$sth->setFetchMode(PDO::FETCH_ASSOC); 
$results = $sth->fetchAll();
$uu = array_unique($results);

echo "<pre>";
print_r($uu);
echo "</pre>";

等等。

根据我对
array\u unique
的理解,它不会递归地遍历数组。它将看到,
$uu===array()
的每个值因此在保留键的同时删除除一个以外的所有值。如果结果键总是0,我不会感到惊讶

在手册中,请参见注释:

请注意,array_unique()不适用于多维数组

从手册中:

注意:请注意,array_unique()不适用于多维数组

进一步:

注:当且仅当(字符串)$elem1==(字符串)$elem2时,两个元素被视为相等。换句话说:当字符串表示形式相同时

当一个数组被转换为字符串时,您会得到“array”



你为什么要调用
array\u unique
?您的数据库已经确保了唯一性

我不太清楚细节,但这似乎是你想要的。我自己还在学习SQL

array_unique()按项目的字符串表示形式进行比较。如手册所述

当且仅当(字符串)$elem1时,两个元素被视为相等=== (字符串)$elem2

数组的字符串转换总是会产生“array”,因此PHP认为所有项都是相同的,而array_unique()只返回一个项


要解决这个问题,您必须编写自己的函数,可能需要确保in_array()。由于行来自数据库,您应该能够重新编写SQL,以便只返回唯一的行。

DISTINCT关键字作用于整行,而不仅仅是一个字段。添加
DISTINCT
意味着结果集中的每一行都是唯一的(与其他行相比)。行可以共享一些字段,但不是所有字段。

由于隐私问题,我无法显示确切的内容,但我会在几分钟后发布结构…@Paul显示一个小的消毒样本,那么您为什么要首先使用
array\u unique
?这不是
DISTINCT
所做的吗?我会手动遍历数组并检查是否存在重复。请参阅@Rocket出于某种原因
DISTINCT
没有返回唯一的集合…@Paul:您必须实现自己的解决方案:P@Paul这只是一个想法,但我希望SQL查询能够基于特定(或多个)字段提供唯一的行。在PHP中迭代数组,然后在每个子数组上运行唯一的检查,会占用更多的资源。这是
DISTINCT
应该完成的,但它不起作用。我做错了吗?看看这个:它应该可以帮助你成功地回答你的问题。“你的数据库已经确保了唯一性。”这是我遇到的另一个问题,它没有检索唯一的数据集。有一些重复的。不确定我做错了什么…只要
title
就足够了。我们的SQL查询相当于只选择每一行。谢谢@LeviMorrison,在您删除SQL之前,我尝试过该SQL,正如Rocket所说,它选择了所有内容。@LeviMorrison看起来这可能已经成功了。Gona试驾一下……;)
array(23) {
  [0]=>
  array(3) {
    ["title"]=>
    string(26) "String Here"
    ["courseId"]=>
    string(1) "8"
    ["location"]=>
    string(1) "1"
  }
  [1]=>
  array(3) {
    ["title"]=>
    string(26) "Another String Here"
    ["courseId"]=>
    string(1) "8"
    ["location"]=>
    string(1) "2"
  }
  [2]=>
  array(3) {
    ["title"]=>
    string(24) "Third String Here"
    ["courseId"]=>
    string(1) "5"
    ["location"]=>
    string(1) "2"
  }
SELECT title, courseId, location
FROM training
GROUP BY title;