2012-03-23 50 views
0

比方說,我有一個數組,其中有4個數組。我需要做的是取一個數字最多的數字,如果我有兩個或更多個數組相同的最大數組,我將它們合併。如何確定包含大多數項目的數組?

示例數組中,我們看到數組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); 
     } 
    } 
} 

那麼它可以做得更好或這是它應該是什麼樣子?

+1

相反array_push'ing陣列中的所有項目到另一個陣列,可以使用array_merge(http://php.net/manual/en/function.array-merge.php)。這是我乍看之下唯一改變的事情。 – 2012-03-23 14:55:25

回答

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); 
    } 
} 
+0

看起來不錯。 – 2012-03-23 14:53:29

+0

我想在這裏做一個更改,他希望最終數組包含所有的值,而不是數組的值。所以,我會把'$ result [] = $ arr;'改成'$ result = array_merge($ result,$ arr);' – 2012-03-23 14:57:51

+0

@Rocket,是的,你是對的,我編輯過。謝謝。 – marvin 2012-03-23 15:25:56

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