2011-01-19 12 views
2

私は配列$MyArrayを持っています。配列にはいくつかの要素があります(サブ配列を呼び出すことができます)。ほとんどの要素を持つサブアレイにいくつの要素があるかを知りたい。問題インデックスが存在するかどうか私にはわからないということです:count()で未定義のオフセット

max(
    @count($MyArray[$i*7]), 
    @count($MyArray[$i*7+1]), 
    @count($MyArray[$i*7+2]),   
    @count($MyArray[$i*7+3]), 
    @count($MyArray[$i*7+4]), 
    @count($MyArray[$i*7+5]), 
    @count($MyArray[$i*7+6]) 
); 

$MyArrayのStruckture:

Array(
    12 => array ( 
     0 => array (0 => 0, 1 => 1,), 
     1 => array (0 => 13, 1 => 1,), 
     2 => array (0 => 15, 1 => 1,), 
     3 => array (0 => 20, 1 => 1,), 
     4 => array (0 => 69, 1 => 1,) 
), 
    5 => array ( 
     0 => array (0 => 55, 1 => 1,), 
     1 => array (0 => 32, 1 => 1,), 
     2 => array (0 => 12, 1 => 1,), 
     3 => array (0 => 21, 1 => 5,) 
), 
    .... 
) 

は、これは(速い)よりよく行うことができますか?

編集:私はforeachを知っています。この配列のすべての要素をループしたくありません。私はちょうどそれの間隔が欲しい。 $MyArray[$i*7 + x]Nullarrayかわからないので@が使用されています。

$iは私が見る[0、1、2、3、4](時には5)

+1

を指し正確に把握していない、基本的には1つの、多くのサブアレイの配列、および持っています目標は、要素の数が最も多い部分配列を取得し、要素全体を数えることです。 – kjy112

+0

@ kjy112の目的は、そのサブアレイの要素を数えるだけで、そのサブアレイを取得することさえありません。 – shamittomar

+1

PHPエラー抑制 '@'が悪用されると悪魔 –

答えて

2

はこれを試してみてください:

$arr = array(); 
for ($j=0;$j<=6;$j++) { 
    if (isset($MyArray[$i*7+$j])) $arr[] = count($MyArray[$i*7+$j]); 
} 
$result = max($arr); 

私は$iはそういえ...

+0

こんにちはnetcoder、 あなたのスクリプトに感謝します。最も速いようです(http://martin-thoma.blogspot.com/2011/01/benchmarking-php.htmlを参照)。私はもっ​​と多くの関数( 'isset' +' count')を使うのは、単に '@'で警告を省略し、 'isset'を使わないよりも時間がかかると思っていました。 –

4
$biggest = 0; 
foreach ($MyArray as $value) { 
    if ($biggest < count($value)) { 
     $biggest = count($value); 
    } 
} 

の要素である、あなたは正しい配列で最大の配列の大きさをしたいですか?

+0

私はあなたにupvoteしたいと思いますが、不必要に 'count'を2回呼びます。 –

+1

@brain_d:私はそれが心配ではないと確信しています。 'count()'はサイズを取得するだけで、実際にはカウントしません。それを配列に格納するだけで変数を作成し、処理を使い果たします。さらに、概念を伝えるためにキャッシングは必要ありません。しかし、観察に感謝します。 – Jonah

+2

+1私はそれがO(1)であることを知らなかった。 http://stackoverflow.com/questions/4566314/php-what-is-the-complexity-i-e-o1-on-of-the-function-count –

3

シンプルで古い学校のアプローチ:

<?php 

$max = -1; 
foreach($MyArray as $subarray) 
{ 
    $items = count($subarray); 
    if($items > $max) 
     $max = $items; 
} 

echo $max; 
?> 

あなただけのほとんどの要素を持つサブアレーがありどのように多くの要素を知りたいので、これは最も適しています。

3
$max = 0; 
foreach ($MyArray as $value) { 
    $max = max($max,count($value)); 
} 
+0

+1は 'max()'を使用します。うわー、とてもきれいです。 – Jonah

+1

'$ max = $ MyArray? max(array_map( 'count'、$ MyArray)):0; 'はさらに良いIMO :-) – arnaud576875

+0

@ user576875:8Oこれは最高です。私はあなたが 'max'に配列を渡すことができるのか分からなかった。 – Jonah

1
// get the interesting part of the array 
$chunk = array_intersect_key($input_array, array_flip(range($i*7, $i*7+6))); 
// max(count) 
$max = $chunk ? max(array_map('count', $chunk)) : 0; 
+0

まあ、これはまったく正しいわけではありませんが、ほとんどです。範囲は値を与えますが、キーが必要です: $ chunk = array_intersect_key($ MyArray、array($ i * 7 => 1、$ i * 7 + 1 => 2、$ i * 7 + 2 => 3、$ i * 7 + 3 => 4、$ i * 7 + 4 => 5、$ i * 7 + 5 => 6)); else {$ max = 0;} –

+0

ああ、あなたが正しいです。 '$ chunk = array_intersect_key($ input_array、array_flip(range($ i * 7、$ i * 7 + 6))); $ max = $ chunk? max(array_map( 'count'、$ chunk)):0; ' – arnaud576875

関連する問題