2011-01-19 4 views
2

J'ai un tableau $MyArray qui a quelques éléments qui sont aussi array (appelons les sous-réseaux). Je veux savoir combien d'éléments le sous-tableau avec le plus d'éléments a. Le problème est que je ne sais pas si l'index existe:Offset non défini avec 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]) 
); 

Struckture de $MyArray:

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,) 
), 
    .... 
) 

cela peut-il être fait mieux (plus vite)?

edit: Je connais foreach et je ne veux pas boucler tous les éléments de ce tableau. Je veux juste un intervalle de celui-ci. @ est utilisé, parce que je ne sais pas si $MyArray[$i*7 + x] est Null ou array.

$i est un élément de [0, 1, 2, 3, 4] (parfois 5)

+1

donc, au fond vous avez un tableau avec plusieurs sous-réseaux, et le but est d'obtenir le sous-tableau avec le plus grand nombre d'éléments et de compter les éléments totaux? – kjy112

+0

@ kjy112, le but est de simplement compter les éléments de ce sous-réseau, sans même obtenir ce sous-réseau. – shamittomar

+1

PHP error suppression, '@', quand overused est le diable –

Répondre

2

Essayez ceci:

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

Je ne sais pas exactement ce que $i fait référence à ... si

+0

Salut netcoder, merci pour votre script. Il semble que c'est le plus rapide (voir http://martin-thoma.blogspot.com/2011/01/benchmarking-php.html). Je pensais que l'utilisation de plus de fonctions ('isset' +' count') prendrait plus de temps que de simplement surimprimer les avertissements avec '@' et n'utiliserait pas 'isset'. –

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

Je vois, vous voulez que la taille du plus grand tableau dans le tableau, correct?

+0

Je vous aurais mis en colère, mais vous appelez inutilement 'count' deux fois –

+1

@brain_d: Je suis à peu près sûr que ce n'est pas un problème. 'count()' obtient juste la taille, il ne les compte pas réellement. Et le stocker dans un tableau crée juste une variable, qui utilise le traitement. De plus, la mise en cache n'est pas nécessaire pour transmettre le concept. Merci pour l'observation cependant. – Jonah

+2

+1 Je ne savais pas que c'était O (1). http://stackoverflow.com/questions/4566314/php-what-is-the-complexity-i-e-o1-on-of-the-function-count –

3

simple et ancienne approche scolaire:

<?php 

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

echo $max; 
?> 

Cela fonctionne mieux puisque vous voulez seulement savoir combien d'éléments le sous-tableau avec les éléments les plus a.

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

+1 pour l'utilisation de 'max()'. Wow, très propre. – Jonah

+1

'$ max = $ MyArray? max (array_map ('count', $ MyArray)): 0; 'est encore mieux IMO :-) – arnaud576875

+0

@ user576875: 8O c'est génial. Je ne savais pas que vous pouviez passer un tableau à '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

Eh bien, ce n'était pas tout à fait exact, mais presque.range donne des valeurs, mais j'ai besoin de clés: $ chunk = array_intersect_key ($ MyArray, tableau ($ i * 7 => 1, $ i * 7 + 1 => 2, $ i * 7 + 2 => 3, $ i * 7 + 3 => 4, $ i * 7 + 4 => 5, $ i * 7 + 5 => 6)); si (compte ($ chunk)> 0) {$ max = max (tableau_module ('compte', $ bloc));} else {$ max = 0;} –

+0

ah vous avez raison; puis '$ chunk = array_intersect_key ($ input_array, array_flip (intervalle ($ i * 7, $ i * 7 + 6))); $ max = $ chunk? max (array_map ('count', $ chunk)): 0; ' – arnaud576875

Questions connexes