Php 将重复的数组值放入子数组
我有一个从MYSQL查询创建的数组,它可能有重复的值,如下所示:Php 将重复的数组值放入子数组,php,arrays,duplicates,Php,Arrays,Duplicates,我有一个从MYSQL查询创建的数组,它可能有重复的值,如下所示: Array ( [0] => title1 [1] => title2 [2] => title2 [3] => title3 [4] => title4 [5] => title5 [6] => title6 [7] => title6 [8] => title6 ) 我不想删除这些值,因此array\
Array
(
[0] => title1
[1] => title2
[2] => title2
[3] => title3
[4] => title4
[5] => title5
[6] => title6
[7] => title6
[8] => title6
)
我不想删除这些值,因此array\u unique()
在这里没有帮助。相反,我希望将重复值分组到子阵列中,以便新阵列成为:
Array
(
[0] => title1
[dupe1] => Array
(
[0] => title2
[1] => title2
)
[1] => title3
[2] => title4
[3] => title5
[dupe2] => Array
(
[0] => title6
[1] => title6
[2] => title6
)
)
编辑:我尝试了以下操作:
$clean = array_unique( $array );
$dupes = array_diff($array, array_diff($array, array_diff_assoc($array, $clean)));
foreach ($dupes as $k => $v)
{
if (in_array($v, $clean))
{
$key = array_search($v, $clean);
unset($clean[$key]);
}
$clean[$v]['dupe'][] = $v;
}
dumpArray(array_values($clean));
输出:
Array
(
[0] => title1
[1] => title3
[2] => title4
[3] => title5
[4] => Array
(
[dupe] => Array
(
[0] => title2
[1] => title2
)
)
[5] => Array
(
[dupe] => Array
(
[0] => title6
[1] => title6
[2] => title6
)
)
)
所以这里有一个方法你可以做到。。创建一个HashMap,标题作为键,原始数组中的索引作为值。这将使您将重复项分组在一起。由于您希望保持(原始)顺序,您可以使用与当前类似的方法进行工作,或者构建一个全新的
$clean
,如下所示(请参见其工作原理):
排序($array);
$unique_length=计数(数组_unique($array));
$total_dups=0;
$clean=array();
对于($i=0;$iYes,您已经尝试了什么?@kingkero-抱歉,我添加了我最新的(混乱的)尝试。太好了。非常感谢!
sort($array);
$unique_length = count( array_unique($array) );
$total_dupes = 0;
$clean = array();
for ($i=0; $i<$unique_length; $i++) {
$current = array_shift($array);
if ($current === NULL)//already have all elements
break;
$found = 1;
while (($key = array_search($current, $array)) !== FALSE) {//search for dupes
$found++;
unset($array[$key]);
}
if ($found == 1)
array_push($clean, $current);
else {
$dupes = array();
for ($i=0; $i<$found; $i++)
$dupes[] = $current;
$total_dupes++;
$clean['dupe'.$total_dupes] = $dupes;
}
}