在下面的代码中:
$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,以便只返回唯一的行。