2016-08-12 58 views
1

我有一个名为tags的表,其中包含tag_name和question_id。就像Stack Overflow一样,我可以用逗号分隔每个标签。这样可行。PHP:只显示相同的数组值一次

但我也想显示所有的标签。假设这是从tags表中选择后得到的结果。

Array (
    [0] => Array (
     [tag_name] => tag-1, 
     [question_id] => 1 
    ) 
    [1] => Array (
     [tag_name] => tag-1, 
     [question_id] => 2 
    ) 
    [2] => Array (
     [tag_name] => tag-2, 
     [question_id] => 3 
    ) 

) 

当我遍历它们,我得到

tag-1 
tag-1 
tag-2 

但是,这是我没有多想它。我在想像

tag-1 × 2 
tag-2 

我该如何做到这一点? 我使用CodeIgniter,但它并不重要,因为我只想了解它的逻辑。

在此先感谢。

+3

看来你正在计算重复条目。所以...'COUNT()'他们并做一个GROUP BY ;-)甚至可以使用HAVING与COUNT()'结合使用。这将工作。 –

回答

1

我没有测试过这一点,但这样的事情应该工作:

<?php 
$tag_array = [ 
    0 => [ 
     'tag_name' => 'tag-1', 
     'question_id' => 1 
    ], 
    1 => [ 
     'tag_name' => 'tag-1', 
     'question_id' => 2 
    ], 
    2 => [ 
     'tag_name' => 'tag-2', 
     'question_id' => 3 
    ], 
]; 

$count_tags = array(); 

foreach($tag_array as $v) 
{ 
    if(!isset($count_tags[$v['tag_name']])) 
    { 
     $count_tags[$v['tag_name']] = 0; 
    } 

    ++$count_tags[$v['tag_name']]; 
} 

// Sort your tags from hi to low 
arsort($count_tags); 

foreach($count_tags as $k=>$v) 
{ 
    echo $k.($v > 1 ? ' x '.$v : '').'<br>'; 
} 

输出:

 
tag-1 × 2 
tag-2 

或者你也可以做到这一点的SQL:

select 
    tag_name, 
    count(tag_name) as tag_count 
from 
    tags 
group by 
    tag_name 
order by 
    count(tag_name) desc 
+1

我看到编辑*大声笑*似乎你看到我的意见在那里;-)你没有在那里的SQL部分。 –

+0

@ Fred-ii-哈哈,是的!我一开始并没有注意到这个问题上的mysqli标签,所以我不想让OP假设有权访问数据源:-) – MonkeyZeus

+0

好吧,他们有选择;-) –

1

我对问题的回答是:

$array = [ 
    0 => [ 
     'tag_name' => 'tag-1', 
     'question_id' => 1 
    ], 
    1 => [ 
     'tag_name' => 'tag-1', 
     'question_id' => 2 
    ], 
    2 => [ 
     'tag_name' => 'tag-2', 
     'question_id' => 3 
    ], 
]; 

$count = []; 
foreach ($array as $arr) 
{ 
    if (empty($count[$arr['tag_name']])) 
    { 
     $count[$arr['tag_name']] = 1; 
    } 
    else 
    { 
     $count[$arr['tag_name']]++; 

    } 
} 

foreach ($count as $key => $c) 
{ 
    echo $key . (($c > 1) ? ' x' . $c : '') . '<br>';' 
} 

// outputs: 
tag-1 x2 
tag-2 
+0

这也可能工作,但它看起来像MonkeyZeuz的回答 – mzcoxfde

+0

猜猜我在回答之前忘了刷新页面,如果你愿意,我会关闭我的答案。 (我们有类似的想法,我想) – feareoc

+0

呐,没关系,谢谢 – mzcoxfde