2016-08-12 12 views
1

tag_nameとquestion_idを含むtagsというテーブルがあります。スタックオーバーフローのように、各タグをカンマで区切って挿入することができます。それは動作します。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

編集* lol *がそこに私のコメントを見たようです;-)あなたはそこにSQLの部分を持っていませんでした。 –

+0

@ Fred-ii- haha​​、yep!私は最初に質問に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

Na、それは問題ではありません、とにかく – mzcoxfde

関連する問題