2010-07-01 5 views
3

J'ai un tableau comme celui-ci:PHP Looping dans la moitié du tableau

foreach($obj as $element){ 
//do something 
} 

Mais si le tableau contient plus de 50 éléments (il est généralement 100) Je veux seulement faire une boucle à travers les 50 premiers d'entre eux , puis rompez la boucle.

+1

Je ne comprends pas le problème. La boucle 'foreach' ne fera que passer à travers les éléments qui existent dans' $ obj'. Voulez-vous dire seulement les 50 premiers, peu importe la taille de «$ obj»? –

+0

Je suppose qu'il veut dire boucler à travers la moitié du tableau, peu importe sa taille. Par exemple. en boucle à travers les 30 premiers éléments si le tableau contient 60 éléments. –

Répondre

7

Works pour tout tableau, non seulement pour ceux avec les touches numériques 0, 1, ...:

$i = 0; 
foreach ($obj as $element) { 
    // do something 
    if (++$i == 50) { 
     break; 
    } 
} 
10

Boucle dans la moitié.

for($i=0; $i<count($obj)/2; $i++) 
{ 
    $element = $obj[$i]; 
    // do something 
} 

ou si vous voulez 50 premiers éléments toujours

$c = min(count($obj), 50); 
for($i=0; $i<$c; $i++) 
{ 
    $element = $obj[$i]; 
    // do something 
} 
+1

+1 pour l'utilisation de min() – willoller

+0

Le premier pour ne fonctionnera pas si le tableau contient, disons, 60 éléments. – Cristian

+5

Ne fonctionne que pour les tableaux avec des clés entières commençant par 0 et dont les clés sont consécutives. – Artefacto

0
for($i=0; $i < 50; $i++) 
{ 
    // work on $obj[$i]; 
} 
+1

Ne fonctionne pas sur les tableaux associatifs. – RobertPitt

11

manière propre:

$arr50 = array_slice($obj, 0, 50); 
foreach($arr50 as $element){ 
    // $element.... 
} 

manière normale (ce qui ne fonctionne que pour les tableaux avec les index numériques et avec asc ordre):

for($i=0; $i<50 && $i<count($obj); $i++){ 
    $element = $obj[$i]; 
} 

Ou si vous voulez utiliser foreach vous avoir utiliser un compteur:

$counter = 0; 
foreach($obj as $element){ 
    if($counter == 50) break; 
    // my eyes!!! this looks bad! 
    $counter++; 
} 
+1

+1 pour offrir une variété de solutions. –

+0

-1 (bien que je n'aie pas vraiment le cœur de vraiment vous voter) pour offrir une variété de solutions. – salathe

+0

LOL ... ne vous inquiétez pas. C'est l'idée de SO. Quoi qu'il en soit ... pourquoi le -1? – Cristian

1
for ($i = 0, $el = reset($obj); $i < count($obj)/2; $i++, $el = next($obj)) { 
    //$el contains the element 
} 
+0

Ive jamais vu quelqu'un adapter trois fonctions dans l'itérateur 1 boucle:/ – RobertPitt

0

Voici l'approche la plus évidente pour moi:

$i = 0;   // Define iterator 

while($obj[$i]) // Loop until there are no more 
{ 
trace($obj[$i]); // Do your action 
$i++;   // Increment iterator 
} 
+0

cela se terminera prématurément si l'un des éléments évalue à false dans la garde. – Artefacto

+0

cela m'a fait sourire. – RobertPitt

0

Cela devrait fonctionner dans tous les cas pour la moitié d'un tableau indépendamment de la longueur et si elle a des indices numériques ou non:

$c = intval(count($array)/2); 
reset($array); 
foreach(range(1, $c) as $num){ 
    print key($array)." => ".current($array)."\n"; 
    next($array); 
} 
3

Une alternative propre serait d'utiliser un couple de la SPLiterators aime:

$limit = new LimitIterator(new ArrayIterator($obj), 0, 50); 
foreach ($limit as $element) { 
    // ... 
} 

L'approche procédurale identique a déjà été mentionné, voir les réponses à l'aide array_slice.

+0

gentil ... J'ai l'impression d'utiliser l'interface Java 'Iterator'! – Cristian

1

Keep it simple

$filtered = array_slice($array,0,((count($array)/2) < 50 && count($array) > 50 ? 50 : count($array))); 
//IF array/2 is les that 50- while the array is greater then 50 then split the array to 50 else use all the values of the array as there less then 50 so it will not devide 
foreach($filtered as $key => $row) 
{ 
    // I beliave in a thing called love. 
} 

ce qui se passe ici

array_slice(
    $array, //Input the whole array 
    0, //Start at the first index 
    (
    count($array)/2 //and cut it down to half 
) 
) 
+0

Que faire si le tableau a 60 éléments? Il comptera seulement les 30 premiers. – Cristian

+0

Ok ive faire une modification. heres the login 'SI ((array/2 est inférieur à 50) alors obtenir un tout 50 sinon utiliser tout le tableau)' c'est difficile de l'expliquer, mais devrait fonctionner. – RobertPitt

+0

OK ... ça va marcher. Mais, pourquoi ne pas simplement utiliser 'array_slice ($ array, 0, 50)'? – Cristian