确定具有大多数项目的数组的方法?

时间:2012-03-23 14:40:41

标签: php arrays

假设我有一个包含4个数组的数组。我需要做的是选择其中包含最多数字的数字,如果我有2个或更多具有相同最大数字的数组,我将把它们组合起来。

示例数组,我们看到数组03的最大成员为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);
        }
    }
}

那么可以做得更好,或者这应该是什么样的?

3 个答案:

答案 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] ] );
}