好的,在php数组中有很多重复检测和删除的例子,使用array_unique()等但是如果你想找到重复,修改它们,再循环检查直到所有重复现在都是唯一的呢? / p>
我认为这类似于使用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 :(得分: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);
答案 1 :(得分: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;
}
}
您可能会注意到这里没有太大的不同。我只想添加&& !is_numeric($val)
,我想你不想处理这个ID。虽然,我仍然认为ID永远不会重复。