Удалить повторяющиеся значения из массива - PullRequest
1 голос
/ 21 июля 2011

Я не могу "удалить" двойные значения из массива, даже если я использую функцию array_unique!

<?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 
*****/
?>

Ответы [ 4 ]

1 голос
/ 21 июля 2011

Убедитесь, что возвращаемые значения на самом деле не являются уникальными. Например

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

Будет по-прежнему содержать 4 записи.

Если какие-либо записи содержат пробелы, вы должны trim this.

0 голосов
/ 22 июля 2011

Поскольку никто не дал правильного ответа, я повторю свой комментарий здесь:

Возможно, слова имеют предшествующие или завершающие пробелы. Тогда они никогда не будут равны друг другу. Вы можете удалить эти пробелы с помощью trim [документы]

$value = ucwords(strtolower(trim($value)));
0 голосов
/ 21 июля 2011

Учитывая, что это единственное, что должен делать 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));

Однако проблема возникает только потому, что схема базы данных не нормализована.

0 голосов
/ 21 июля 2011

Просто используйте значения в качестве ключей, они могут существовать только один раз, и в качестве ключевых слов у вас нет чисел (надеюсь):

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

array_flip будет использовать значения в качестве ключей (и отбрасывать повторяющиеся значения), а array_keys будет возвращать все ключи в качестве значений снова.

...