【问题标题】:array_unique only returns one recordarray_unique 只返回一条记录
【发布时间】:2012-08-22 20:35:39
【问题描述】:

在下面的代码中:

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

等等……

【问题讨论】:

  • 由于隐私问题,我无法显示确切的内容,但我会在一分钟内发布结构......
  • @Paul 展示一个经过消毒的小样本
  • 你为什么首先使用array_uniqueDISTINCT 不就是这样做的吗?
  • 我会手动遍历数组并检查是否重复。见stackoverflow.com/questions/4585208/…
  • @Rocket 出于某种原因 DISTINCT 没有返回唯一的集合...

标签: php array-unique


【解决方案1】:

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

在手册中查看注释:

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

【讨论】:

  • @Paul:您必须实施自己的解决方案:P
  • @Paul 只是一个想法,但我希望使用 SQL 查询来提供基于特定(或多个)字段的唯一行。遍历 PHP 中的数组,然后对每个子数组运行唯一检查将更加占用资源。
  • 这就是DISTINCT 应该完成的,但它不起作用。我做错了吗?
  • 看看这个:stackoverflow.com/questions/546804/… 它应该可以帮助您成功回答您的问题。
【解决方案2】:

来自手册:

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

进一步:

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

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


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

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

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

【讨论】:

  • "您的数据库已经确保了唯一性。"这是我遇到的另一个问题,它不是检索唯一的数据集。有一些重复。不知道我做错了什么......
  • 只需title 就足够了
  • 您的 SQL 查询相当于只选择每一行。
  • 谢谢@LeviMorrison 在您删除它之前我尝试了该 SQL,正如 Rocket 所说,它选择了所有内容。
  • @LeviMorrison 看起来这可能已经成功了。去试驾吧……;)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 2016-05-22
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多