排列数组并删除重复值

时间:2016-08-22 15:57:31

标签: php arrays sorting

我遇到了一个棘手的任务,如果代码在很多foreach循环中非常混乱,我无法解决。

这是基本逻辑:

阵中只能有独特的食物,所以只有一个人可以吃披萨,只有一个人可以吃意大利面等。但是他们可以有多种食物。并且阵列中含有最多食物的人应该在食物很少的情况下赢得食物。

所以John应该从数组中删除,因为Joe或Conny将拥有他的。

由于Joe和Conny有相同数量的食物,其中一个会保留他所有的食物而另一个应该从阵列中删除,无论是Joe还是Conny都应该随机挑选。

起始数组如下所示:

Array
(
    [Joe] => Array
        (
            [0] => Pizza
            [1] => Pasta
            [2] => Lasagne
            [3] => Tacos
            [4] => Hamburger
        )

    [Conny] => Array
        (
            [0] => Pizza
            [1] => Pasta
            [2] => Lasagne
            [3] => Tacos
            [4] => Hamburger
        )

    [John] => Array
        (
            [0] => Pizza
            [1] => Pasta
        )

    [Fred] => Array
        (
            [0] => Pizza
            [1] => Pasta
            [2] => Soup
            [3] => Fish
        )

    [Greg] => Array
        (
            [0] => Sushi
        )

)

我想要的最终结果是:

Array
(
    [Joe] => Array
        (
            [0] => Pizza
            [1] => Pasta
            [2] => Lasagne
            [3] => Tacos
            [4] => Hamburger
        )

    [Fred] => Array
        (
            [2] => Soup
            [3] => Fish
        )

    [Greg] => Array
        (
            [0] => Sushi
        )

)

所以只有独特的食物留在阵列中,如果两个或更多的家伙有相同的量,它应该随机选择这些是否应该保留食物。

我有什么建议吗?

1 个答案:

答案 0 :(得分:2)

您必须首先使用带有uasort的用户定义函数,以相反的顺序,根据子阵列中元素的数量对数组进行排序。然后你可以使用两个foreach循环来循环遍历循环。您将使用辅助变量来确定是否已使用食物,如果是,unset元素。完成后,使用array_filter过滤掉数组中的空元素。

uasort($food, function($a, $b) {
    return count($b) <=> count($a);
});

$used = array();
foreach($food as $kl => $pl) {
    foreach($pl as $k => $p) {
        if(!in_array($p, $used)) {
            $used[] = $p;
        } else {
            unset($food[$kl][$k]);
        }
    }
}
$food = array_filter($food);

您可以在此处查看:https://3v4l.org/LjpGD

参考:
http://php.net/uasort
http://php.net/in_array
http://php.net/array_filter

PS:代码使用自PHP 7.0以后的新版spaceship operator。如果您不使用或不能使用PHP7,则必须使用if结构进行比较。

if(count($b) > count($a)) {
    return 1;
} elseif(count($b) == count($a)) {
    return 0;
} else {
    return -1;
}