在下面的代码中:
$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);
如果删除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"
}
等...
答案 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,因此只返回唯一的行。