2011-07-21 81 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)));