array_unique只返回一条记录


array_unique only returns one record

在下面的代码中:

$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>";

我只从print_r($uu); 得到1个结果

如果删除array_unique,则返回所有(30+)行。(不,不是所有的都是重复的):)

我做错了什么?

编辑var_dump()结果:

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

等等。。。

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

在手册中,请参阅注释:

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

来自手册:

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

进一步:

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

当一个数组被强制转换为字符串时,就会得到"array"。


你为什么要打array_unique?您的数据库已经确保了唯一性。

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

SELECT title, courseId, location
FROM training
GROUP BY title;

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

array_unique()通过字符串表示比较项。如手册所述,

两个元素被认为是相等的当且仅当(string)$elem1===(字符串)$elem2

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

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