假设我有一个包含4个数组的数组。我需要做的是选择其中包含最多数字的数字,如果我有2个或更多具有相同最大数字的数组,我将把它们组合起来。
示例数组,我们看到数组0
和3
的最大成员为3
。所以我要做的就是把它们结合起来。
Array
(
[0] => Array
(
[0] => 5
[1] => 6
[2] => 4
)
[1] => Array
(
[0] => 5
[1] => 6
)
[2] => Array
(
[0] => 4
)
[3] => Array
(
[0] => 6
[1] => 6
[2] => 9
)
)
这就是我所拥有的,它的工作原理,但我认为可以做得更好。
// Getting arrays that have most members in it
$max = count($groupArray[0]);
foreach ($groupArray as $group) {
if (count($group) > $max) {
$max = count($group);
}
}
// Taking all those arrays and combining them in one
$finishArray = array();
foreach ($groupArray as $group) {
if (count($group) == $max) {
foreach ($group as $key) {
array_push($finishArray, $key);
}
}
}
那么可以做得更好,或者这应该是什么样的?
答案 0 :(得分:3)
我认为你可以在一个循环而不是两个循环中完成它。
不是在一个循环中找到最大值并在第二个循环中搜索最大值,而是在循环时搜索,如果找到更大的数组并重置结果,则更改最大值。你知道在那之前没有匹配,所以你可以继续。
$max = 0;
foreach($groupArray as $arr) {
$count = count($arr);
if($count > $max) {
$result = $arr;
$max = $count;
} else if($count == $max) {
$result = array_merge($result, $arr);
}
}
答案 1 :(得分:1)
你有什么作品,我不知道它可以改进多少,但我会尝试。
要获得最大数量,您可以执行以下操作(array_map
非常棒):
$max = max(array_map(create_function('$a','return count($a);'), $groupArray));
如果你有PHP 5.3,你可以这样做:
$max = max(array_map(function($a){return count($a);}, $groupArray));
至于第二部分,你将不得不循环遍历数组并获得具有相同长度的数组(就像你所做的那样),但不是循环使用array_push
,你可以使用array_merge
。
$finishArray = array();
foreach($groupArray as $group){
if(count($group) === $max){
$finishArray = array_merge($finishArray, $group);
}
}
答案 2 :(得分:0)
您不需要遍历$groupArray
两次,只需存储最长子项的索引。
<?php
$indices = array();
$max_len = 0;
for ($i=0, $n=count($groupArray); $i<$n; $i++) {
$tmp = count( $groupArray[$i] );
if ( $tmp > $max_len ) {
$max_len = $tmp;
$indices = array($i);
} elseif ( $tmp == $max_len ) {
$indices[] = $i;
}
}
$finishArray = array();
for ($i=0, $n=count($indices); $i<$n; $i++) {
$finishArray = array_merge( $finishArray, $groupArray[ $indices[$i] ] );
}