2

在下面的代码中:

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

我只得到 1 个结果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"
  }

ETC...

4

4 回答 4

5

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

在手册中查看注释:

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

于 2012-08-22T20:40:41.333 回答
2

从手册:

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

更远:

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

当一个数组被转换为一个字符串时,你会得到“Array”。


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

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

SELECT title, courseId, location
FROM training
GROUP BY title;
于 2012-08-22T20:44:17.563 回答
1

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

于 2012-08-22T20:55:30.760 回答
0

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

两个元素被认为相等当且仅当 (string) $elem1 === (string) $elem2

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

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

于 2012-08-22T20:49:33.880 回答