PHP array_unique 返回重复项

标签 php mysql

<分区>

这是我的表tracks:

+---+--------------------+
| id|                 tag|
+---+--------------------+
| 1 |              dance,|
| 2 |        dance,tecno,|
| 3 |        dance,hihop,|
| 4 |                rap,|
| 5 |            country,|
| . |                 ...|
+---+--------------------+

我试过了($value 是我的查询):

$tags = $this->db->query(sprintf("SELECT `tag`, `id` FROM `tracks` WHERE `tag` LIKE '%s' GROUP BY `tag` DESC LIMIT %s, %s", '%'.$this->db->real_escape_string($value).'%', $this->db->real_escape_string($start), $per_page));

while($row = $tags->fetch_assoc()) {
    $rows[] = $row;
}

$tags = explode(',', $row['tag']);
$rows = array_unique(array_map('strtolower', $tags));

foreach($rows as $row) {
    if(stripos($row, $value) !== false) {
        $tag_output .= '<div class="hashtag-inner">
                            '.$row.'
                        </div>';
    }
}

从这个例子。预期的输出是:dance, tecno, hiphop, rap, country 带有所有唯一标签而不是我有标签 dance 的多个输出。 我的输出有什么问题?

最佳答案

您需要在处理每一行的循环中调用 explode()。您的代码只是展开最后一行。

$rows = array();
while ($row = $tags->fetch_assoc()) {
    $tags = explode(',', $row['tag']);
    $rows = array_merge($rows, $tags);
}
$rows = array_unique(array_map('strtolower', array_filter($rows)));

array_filter() 用于删除来自标签列表末尾的 , 的空字符串。

但是,最好的长期解决方案是规范化您的数据库模式,这样您就不会在表中存储以逗号分隔的列表。您应该有一个表格,其中每个标签都在单独的行中。

关于PHP array_unique 返回重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40161220/

相关文章:

php - 使用外部 IP 访问 Linux vps 中的文件的最佳和最简单的方法是什么?

php - 将 double 转换为 Pascal 6 字节(48 位)实数格式

PHP:删除不在大列表中的行

Mysql 安装失败,出现 dpkg : error processing package mysql-server-5. 6 (--configure)

mysql - mysql 中使用 OR 和内连接的 Like 语句

PHP:如何对 U+FFFD 进行编码以进行替换?

php - 使用 jQuery 和 PHP 进行长轮询

php - 如何在 PHP 中将上传的视频文件编码为 .flv 格式

php - 保存单个单击的组合框项目

mysql - 如何为动态字段创建mysql数据库表