2011-07-21 226 views
1

即使我使用array_unique函數,我也無法「從數組中刪除」double值!從數組中刪除重複的值

<?php 
    $tags_array = array() ; 
    $query_tags = $mysql->Query("SELECT words AS kw FROM users ") ; 
    /**** 
    * 
    * This query return something like Array([1] => PHP,ASP,NET [2] => Ruby,Jquery,php,asp_net [3] => Php,asp,visualbasic,c# [4] => [5] =>) 
    * 
    *****/ 
    while($fetch_tags = $mysql->Fetch($query_tags)) 
    { 
     foreach(explode(',',$fetch_tags['kw']) as $kw => $value) 
     { 
      if(empty($value)) ; 
      else 
      { 
       $value = ucwords(strtolower($value)) ; 
       $tags_array[] = $value ; 
      } 
     } 
    } 
$tags_array = array_values(array_unique($tags_array, SORT_STRING)) ; 
print_r($tags_array) ; 
/****** 
* 
* print_r show somethings like this Array([1] => Asp [2] => Php [3] => Php [4] => Ruby [5] => Jquery [6] => Php [7] => Asp_net [8] = >C# [9] => Asp) 
* 
* IT'S ONLY AN EXAMPLE TO SHOW YOU THE SITUATION 
*****/ 
?> 
+0

嘗試'trim'值。 –

+0

對不起,我是小菜鳥告訴我誰能做到這一點:(道歉我 – Claudio

+0

也許有一些空白介入?例如,''PHP,Ruby「,」Asp,PHP「 - > array(」PHP「,」Ruby 「,」Asp「,」PHP「)' –

回答

0

只需使用值作爲鑰匙,他們只能出現一次,你沒有任何數字作爲關鍵字(希望):

$tags_array = array_keys(array_flip(($tags_array)); 

array_flip將使用值作爲鍵(拖放重複值)並且array_keys將再次將所有鍵作爲值返回。

+1

爲什麼他應該使用'array_keys(array_flip(... ))''而不是僅僅使用'array_unique()'? –

+0

我同意費迪南德,看起來似乎令人費解,並且當值不是標量時折斷。 – Wrikken

+0

@Wrikken:在問題中,值都是字符串,沒有數字部分給出。 – hakre

0

鑑於這是aray_unique應該做的唯一的事情,我覺得它非常令人驚訝,它沒有這樣做。你的帖子中顯而易見的是,你可能認爲'php'和'PHP'是一樣的嗎?

當我嘗試以下方法,我得到唯一的結果:

$d=Array('PHP,ASP,NET','Ruby,Jquery,php,asp_net','Php,asp,visualbasic,c#'); 

$o=array(); 

foreach ($d as $i) { 
    $p=explode(',',$i); 
    foreach ($p as $q) { 
     $o[]=strtoupper($q); 
    } 
} 
print_r(array_unique($o)); 

然而,問題僅出現是因爲你的數據庫架構不歸。

1

確保返回的值實際上不是唯一的。例如

$foo = array("PHP","php","pHP","PHP "); 
$foo = array_unique($foo); 

仍將包含4個條目。

如果任何條目包含空格,您應該使用trim這些。

+0

這就是爲什麼他用'ucwords(strtolower($ value))'來標準化? –

+0

是的,它仍然包含它! – Claudio

+0

@費迪南德。第四項有一個空間,這將被錯過。 – Jim

0

由於沒有人似乎提供正確的答案,在這裏我要重複我的評論:

這可能是說話都在前或尾隨空格。那麼他們永遠不會相互平等。您可以刪除這些空格與trim[docs]

$value = ucwords(strtolower(trim($value)));