Php 将重复的数组值放入子数组

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\

我有一个从MYSQL查询创建的数组,它可能有重复的值,如下所示:

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;
    }
}