0

我需要计算重复的多维数组,删除此重复项并将重复计数推入新索引中。

假设我有这个数组:

Array
(
[0] => Array
    (
        [segments] => Array
            (
                [1] => Gcia de Auditoría Interna
                [0] => Auditoria Interna 1
            )

        [groups] => Array
            (
                [estados] => sp
                [cidade] => sumpaulo
            )

    )

[1] => Array
    (
        [segments] => Array
            (
                [2] => Gerencia Recursos Humanos
                [1] => Gcia Dpto Admin de Pers. y Rel. Laboral
                [0] => SubGcia Administración de Personal
            )

        [groups] => Array
            (
                [estados] => sp
                [cidade] => 
            )

    )

[2] => Array
    (
        [segments] => Array
            (
                [2] => Gerencia Recursos Humanos
                [1] => Gcia Dpto Admin de Pers. y Rel. Laboral
                [0] => SubGcia Administración de Personal
            )

        [groups] => Array
            (
                [estados] => sp
                [cidade] => 
            )

    )


 )

我想删除重复的数组并创建一个新的索引计数:

Array
(
[0] => Array
    (
        [segments] => Array
            (
                [1] => Gcia de Auditoría Interna
                [0] => Auditoria Interna 1
            )

        [groups] => Array
            (
                [estados] => sp
                [cidade] => sumpaulo
            )
        [total] = 1

    )

[1] => Array
    (
        [segments] => Array
            (
                [2] => Gerencia Recursos Humanos
                [1] => Gcia Dpto Admin de Pers. y Rel. Laboral
                [0] => SubGcia Administración de Personal
            )

        [groups] => Array
            (
                [estados] => sp
                [cidade] => 
            )
         [total] = 2

    )

 )

可能吗?

4

3 回答 3

1

这看起来真的很难看,但有效。

堆叠foreach版:

http://3v4l.org/Dve0M

$rst=array();
foreach($arr as $ele)
{
    foreach($rst as $i=>$candidate)
    {
        $key=null;
        foreach($ele as $k=>$subarr)
        {
            if(isset($candidate[$k]) && $candidate[$k]==$subarr)
            {
                $key=$i;
                break;
            }
        }
        if(!empty($key))
        {
            break;
        }
    }
    if(!empty($key)) $rst[$key]["total"]+=1;
    else $rst[]=array_merge($ele,array("total"=>1));
}
print_r($rst);

foreach版本:

http://3v4l.org/qUU3a

/* just to ensure the array is sorted.
 * if the array is already pre-sorted,
 * skip this part.
 */
usort($arr,function($a,$b){
    return strcmp(json_encode($a),json_encode($b));
});
$rst=array();
$cache=array();
while($p=array_shift($arr))
{
    if(empty($cache))
    {
        $cache[]=$p;
    }
    elseif($cache[0]==$p)
    {
        $cache[]=$p;
    }
    else
    {
        $rst[]=array_merge($cache[0],array("total"=>count($cache)));
        $cache=array();
        $cache[]=$p;
    }
}
if(!empty($cache))
{
    $rst[]=array_merge($cache[0],array("total"=>count($cache)));
}
print_r($rst);
于 2013-06-19T04:22:38.863 回答
1

此功能有效:

function deduplicate($array) {
    foreach($array as $key => $subArray) { // First Part
        for($i = 0; $i < $key; $i++) {
            if (print_r($subArray, true) == @print_r($array[$i], true)) {
                unset($array[$i]);
            }
        }
    }
    $i = 0;                                // Second Part
    foreach($array as $subArray) {
        $newArray[$i] = $subArray;
        $i++;
    }
    return $newArray;
}

第 1 部分:第 1 行声明了函数。第 2 行启动了一个foreach循环,该循环遍历数组的每个元素,查看它是否与之前的任何元素匹配,如使用for第 3 行的循环检查,检查第 4 行的if语句。第 4 行实际做的是,因为你可以' 不只是比较数组的值以查看它们是否重复,它还使用print_r. 如果字符串匹配,第 5 行删除 ( unsets) 重复元素。阻止它给你错误,因为如果它正在检查的@第二个元素已经被删除,你可能会得到一个错误。第 6、7 和 8 行关闭了for循环、foreach循环和if语句的代码块。现在,您有一个没有重复的数组。

第 2 部分:第 9 行声明了变量,该变量将随着第 12 行的循环$i每次运行而递增。这个递增变量将是新数组中每个元素的新键。第 10 行开始一个循环,它将循环遍历数组,而不会产生第 1 部分产生的重复项。第 11 行将新数组的每个元素(重新索引的元素)设置为循环在第 1 部分的数组中找到的下一个元素。第 12 行递增,如前所述。第 13 行关闭循环的代码块。第 14 行返回新数组,第 15 行关闭函数。这将为您留下一个重新索引的数组版本,其中删除了所有重复的第一维元素。foreach$i++;$iforeachforeach$iforeach

现在你有了一个简短而优雅的方法,并且你确切地知道它是如何工作的。只需将其复制并粘贴到您的 PHP 顶部,无论您有需要执行此操作的数组,只需执行以下操作:

$array = deduplicate($array);
于 2013-06-19T06:31:21.843 回答
0

@过路人

也是这样工作的

foreach($csv as $lines){
        $segstring = implode("+", $lines["segments"]);
        $groupstring = implode("+", $lines["groups"]);


        if(!isset($recsv[$segstring."+".$groupstring]["total"])){
            $recsv[$segstring."+".$groupstring] = $lines;
            $recsv[$segstring."+".$groupstring]["total"] = 0;
        }
        $recsv[$segstring."+".$groupstring]["total"]++;

    }

你说什么?

于 2013-06-19T04:56:50.443 回答