首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定包含大多数项的数组的方法?

问确定包含大多数项的数组的方法?
EN

Stack Overflow用户
提问于 2012-03-23 14:40:40
回答 3查看 89关注 0票数 0

假设我有一个数组,其中包含4个数组。我需要做的是,取其中的数字最多的一个,如果我有两个或更多的数组,其中有相同的最大数字,我会组合它们。

示例数组,我们看到数组0和3有最大的成员,即3。所以我要做的是把它们结合起来。

代码语言:javascript
复制
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
        )
)

这就是我所拥有的,它有效,但我认为它可以做得更好。

代码语言:javascript
复制
// 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);
        }
    }
}

那么,它能做得更好吗?还是应该是这样的呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-23 14:50:56

我想你可以用一个循环代替两个循环。

不要在一个循环中找到最大值并在第二个循环中搜索这个最大值,而是在循环时搜索,如果找到更大的数组并重置结果,则更改最大值。你知道在那之前没有对手,所以你可以继续。

代码语言:javascript
复制
$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);
    }
}
票数 3
EN

Stack Overflow用户

发布于 2012-03-23 14:53:30

你的东西管用,我不知道还能改进多少,但我会试试的。

要获得最大计数,您可以这样做(array_map非常棒):

代码语言:javascript
复制
$max = max(array_map(create_function('$a','return count($a);'), $groupArray));

如果您有PHP5.3,您可以这样做:

代码语言:javascript
复制
$max = max(array_map(function($a){return count($a);}, $groupArray));

至于第二部分,您必须遍历数组并获得相同长度的数组(就像您所做的那样),但是您可以只使用array_merge,而不是循环使用array_merge。

代码语言:javascript
复制
$finishArray = array();
foreach($groupArray as $group){
    if(count($group) === $max){
        $finishArray = array_merge($finishArray, $group);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2012-03-23 14:56:33

您不需要循环两次$groupArray,只需存储最长子节点的索引即可。

代码语言:javascript
复制
<?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] ] );
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9841169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档