假设我有一个数组,其中包含4个数组。我需要做的是,取其中的数字最多的一个,如果我有两个或更多的数组,其中有相同的最大数字,我会组合它们。
示例数组,我们看到数组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);
}
}
}那么,它能做得更好吗?还是应该是这样的呢?
发布于 2012-03-23 14:50:56
我想你可以用一个循环代替两个循环。
不要在一个循环中找到最大值并在第二个循环中搜索这个最大值,而是在循环时搜索,如果找到更大的数组并重置结果,则更改最大值。你知道在那之前没有对手,所以你可以继续。
$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);
}
}发布于 2012-03-23 14:53:30
你的东西管用,我不知道还能改进多少,但我会试试的。
要获得最大计数,您可以这样做(array_map非常棒):
$max = max(array_map(create_function('$a','return count($a);'), $groupArray));如果您有PHP5.3,您可以这样做:
$max = max(array_map(function($a){return count($a);}, $groupArray));至于第二部分,您必须遍历数组并获得相同长度的数组(就像您所做的那样),但是您可以只使用array_merge,而不是循环使用array_merge。
$finishArray = array();
foreach($groupArray as $group){
if(count($group) === $max){
$finishArray = array_merge($finishArray, $group);
}
}发布于 2012-03-23 14:56:33
您不需要循环两次$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] ] );
}https://stackoverflow.com/questions/9841169
复制相似问题