我遇到了一个棘手的任务,如果代码在很多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
)
)
所以只有独特的食物留在阵列中,如果两个或更多的家伙有相同的量,它应该随机选择这些是否应该保留食物。
我有什么建议吗?
答案 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;
}