好的,在php数组中有很多重复检测和删除的例子,使用array_unique()等,但如果你想找到dps,修改它们,在循环中再次检查,直到所有dps现在是唯一的呢?
我认为这有点像使用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
)
在保留原始值(即大。再来一份(副本)……我已经看了几乎每一个PHP数组函数,试图想象一个策略…想法吗?
对于问题中的数组和在末尾添加数字(如果重复),您只需要在数组上循环一次并临时构建一个helper数组,该数组存储是否已经找到值(以及频率):
$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);
演示首先,我认为你的数组结构相当复杂。
你为什么不把它改成这样:
$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;
}
}
你可能会注意到这里没有太大的不同。我只是把&& !is_numeric($val)
加进去,你不会想处理ID的。尽管如此,我仍然认为ID永远不会重复。