array_unique只返回一条记录

时间:2012-08-22 20:35:39

标签: 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>";

我只从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"
  }

等...

4 个答案:

答案 0 :(得分:5)

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

在手册中,请参阅注释:

  

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

答案 1 :(得分:2)

从手册:

  

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

此外:

  

注意:当且仅当(字符串)$ elem1 ===(字符串)$ elem2时,才认为两个元素相等。用文字表示:当字符串表示相同时。

当数组转换为字符串时,您将获得“Array”。


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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

  

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

数组的字符串转换将始终产生“Array”,因此PHP认为所有项都相同,而array_unique()只返回一个项。

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