2011-11-20 35 views
3

好的,php array中有很多重复检测和删除的例子,使用array_unique()等等,但是如果你想查找dups,修改它们,再次检查循环,直到所有dups现在都是唯一的呢?PHP:如何识别和更改数组中的重复值?

我认为它像使用array_filter()...所以作为一个更具体的例子,这里是会出来的sql语句是这样的:

SELECT id, list.comboname 
FROM list 
    INNER JOIN (
     SELECT comboname 
     FROM list 
     GROUP BY comboname 
     HAVING count(id) > 1 
    ) dup ON list.comboname = dup.comboname 

到重复的数组表:

Array ( 
    [0] => 49 
    [1] => big.dup 
    [2] => 233 
    [3] => another.duplicate 
    [4] => 653 
    [5] => big.dup 
    [6] => 387 
    [7] => big.dup 
    [8] => 729 
    [9] => another.duplicate 
    [10] => 1022 
    [11] => big.dup 
) 

现在我想的是一些PHP删除字符,直到时间,这样他们是唯一[或如果需要末尾添加号码]

所以导致将是:

Array ( 
    [0] => 49 
    [1] => big.dup 
    [2] => 233 
    [3] => another.duplicate 
    [4] => 653 
    [5] => big.du 
    [6] => 387 
    [7] => big.d 
    [8] => 729 
    [9] => another.duplicat 
    [10] => 1022 
    [11] => big.dup1 
) 

虽然保留原始值(即, big.dup和another.duplicate)...我已经浏览了几乎所有的PHP数组函数,试图想象一个策略......想法?

+0

你为什么不MySQL中完成这个?我认为这会帮助你:http://stackoverflow.com/questions/7416545/renaming-the-duplicate-data-in-sql – dino

+0

答:因为我想设置它自动执行重复删除而不更改和重新运行SQL .. B.我不想只标记它们,我想将它们更改为非重复,并将它们留下 – idea34

回答

0

首先,我认为你有一个相当复杂的数组结构。

你为什么不把它变成类似:

$arr = array(
    '49' => 'big.dup', 
    '233' => 'another.duplicate', 
    '653' => 'big.dup', 
    '387' => 'big.dup', 
    '729' => 'another.duplicate', 
    '1022' => 'big.dup', 
); 

这样,你可以使用这样的事情很容易地检查重复:

$arr = array(
    '49' => 'big.dup', 
    '233' => 'another.duplicate', 
    '653' => 'big.dup', 
    '387' => 'big.dup', 
    '729' => 'another.duplicate', 
    '1022' => 'big.dup', 
); 
$arr_val = array(); 
foreach($arr as $key => $val) 
{ 
    if(isset($arr_val[ $val ])) 
    { 
     $arr_val[ $val ]++; 
     $arr[ $key ] = $val . $arr_val[ $val ]; 
    } 
    else 
    { 
     $arr_val[ $val ] = 0; 
    } 
} 

或者,如果你坚持要用那复杂的阵列结构,你可以修改上面的代码到这里:

$arr_val = array(); 
foreach($arr as $key => $val) 
{ 
    if(isset($arr_val[ $val ]) && !is_numeric($val)) 
    { 
     $arr_val[ $val ]++; 
     $arr[ $key ] = $val . $arr_val[ $val ]; 
    } 
    else 
    { 
     $arr_val[ $val ] = 0; 
    } 
} 

你可能注意到t这里没有太大的不同。我只是想添加&& !is_numeric($val),因为我认为你不想处理这个ID。尽管如此,我仍然认为ID永远不会重复。

1

对于您的问题中的数组,以及如果重复时在末尾添加数字,您只需循环一次数组,并临时构建一个帮助程序数组,用于存储是否已经找到一个值(以及多长时间):

$found = array(); 

foreach($array as &$value) 
{ 
    if (is_int($value)) continue; # skip integer values 

    if (isset($found[$value])) 
    { 
     $value = sprintf('%s-%d', $value, ++$found[$value]); 
    } 
    else 
    { 
     $found[$value] = 0; 
    } 
} 
unset($value); 

Demo