基于多个键从多维数组中删除重复项

问题描述 投票:0回答:3

抱歉,如果之前有人问过这个问题,但我搜索了很多,找不到解决方案。 我已经尝试解决这个问题一段时间了,但无法为其编写函数。

我有一个这样的数组:

    $numbers = array(
        array("tag" => "developer", "group" => "grp_1", "num" => "123123"),
        array("tag" => "developer", "group" => "grp_2", "num" => "111111"),
        array("tag" => "student", "group" => "grp_1", "num" => "123123"),
        array("tag" => "student", "group" => "grp_2", "num" => "123123"),
        array("tag" => "developer", "group" => "grp_3", "num" => "111111"),
    );

我需要编写一个函数,根据多个键从这个数组中删除重复项,所以我的函数调用应该看起来像这样:

unique_by_keys($numbers, array("num","group"));

换句话说,一个数字不能在同一组中多次。

通过数组调用 unique_by_keys() 后应该是这样的:

    $numbers = array(
        array("tag" => "developer", "group" => "grp_1", "num" => "123123"),
        array("tag" => "developer", "group" => "grp_2", "num" => "111111"),
        array("tag" => "student", "group" => "grp_2", "num" => "123123"),
        array("tag" => "developer", "group" => "grp_3", "num" => "111111"),
    );

如果你能帮助我找到解决方案,或者引导我找到正确的思维方式,我将不胜感激。 谢谢!


解决方案: 通过编写以下函数,我能够找到解决方案: (我以一种接受多种形式的 $haystack 数组的方式编写它)

function unique_by_keys($haystack = array(), $needles = array()) {
    if (!empty($haystack) && !empty($needles)) {
        $_result = array();
        $result = array();
        $i = 0;
        foreach ($haystack as $arrayObj) {
            if (is_array($arrayObj)) {
                $searchArray = array();
                foreach ($needles as $needle) {
                    if (isset($arrayObj[$needle])) {
                        $searchArray[$needle] = $arrayObj[$needle];
                    }
                }
                if (!in_array($searchArray, $_result)) {
                    foreach ($arrayObj as $key => $value) {
                        if (in_array($key, $needles)) {
                            $_result[$i][$key] = $value;
                        }
                    }
                    $result[] = array_merge($_result[$i], $arrayObj);
                }
            } else {
                $result[] = $arrayObj;
            }
            $i++;
        }
        return $result;
    }
}

谢谢大家的回复!

php arrays multidimensional-array
3个回答
3
投票

创建表示目标/过滤列值的复合字符串键——这将确保在过滤时有足够的唯一标识。

使用“空合并赋值运算符”(

??=
)将确保只保留第一个遇到的符合条件的行。

代码:(演示

function unique_by_keys(array $haystack, array $needles): array {
    $columnNames = array_flip($needles);
    $result = [];
    foreach ($haystack as $row) {
        $compositeKey = implode('|', array_intersect_key($row, $columnNames));
        $result[$compositeKey] ??= $row;
    }
    return array_values($result);
}

var_export(
    unique_by_keys($numbers, ["group", "num"])
);

1
投票
$newNumbers = array();
foreach($numbers as $key=>$values){
    $newkey = $values['group'].'__'.$values['num']; 
    $newNumbers[$newkey] = $values;
}
var_dump($newNumbers)

0
投票

代码可能效率不高,但我会为你工作:)

$result = unique_by_keys($numbers, array("num","group"));

echo "<pre>";
print_R($result);

function unique_by_keys($numbers, $arr){
    $new_array = array();
    $output = array();
    foreach ($numbers as $n){

        if(isset($new_array[$n[$arr[1]]]) && $new_array[$n[$arr[1]]] == $n[$arr[0]]){
            continue;
        }else{
            $new_array[$n[$arr[1]]] = $n[$arr[0]];
            $output[] = $n;
        }

    }
    return $output;
}
© www.soinside.com 2019 - 2024. All rights reserved.