2010-09-15 6 views
0

Souvent, je vais avoir un tableau contenant un ensemble de valeurs que je dois traiter. Parfois, le tableau ne contient qu'un seul ensemble, auquel cas chaque valeur doit passer par le processus. D'autres fois, le tableau contiendra plusieurs ensembles, auquel cas chaque valeur sera un tableau et chaque valeur de ces tableaux devra être traitée. Voici un exemple:Simplifier une boucle dans un tableau qui peut être plat ou multidimensionnel

foreach($array as $key => $value) { 
    if(is_array($value)) { 
     foreach($value as $subkey => $subvalue) { 
      //Process $subvalue here  
     } 
    } 
    else { 
     //Process $value here 
    } 
} 

Le problème est que le code de traitement subvalue valeur $/$ est identique sauf qu'il fonctionne sur une autre variable. Une façon de simplifier ce serait de mettre ce code dans une fonction mais il semble encore inélégant d'avoir à l'appeler deux fois. En outre, cela laisserait beaucoup de code (les boucles foreach et le test de tableau) en dehors de cette fonction. Par exemple, disons que le processus est validation, je ne veux pas avoir à écrire deux boucles foreach et un test de tableau chaque fois que je veux appeler ma fonction de validation.

Existe-t-il une façon plus simple de le faire?

Répondre

1

Enveloppez la seule valeur dans un tableau, puis procéder comme d'habitude:

foreach($array as $key => $value) { 

    if(!is_array($value)) $value = array($value); 

    foreach($value as $subkey => $subvalue) { 
     //Process $value/$subvalue here  
    } 
} 

Sinon, vous pouvez créer une fonction qui gère le traitement des éléments simples, puis appelez la même fonction de chaque branche. Vous finirez toujours par enregistrer le processus deux fois.

+0

Excellente idée! Au lieu de tester un tableau, serait-il préférable/plus simple de faire du casting de type? En d'autres termes, au lieu de l'instruction if, mettez simplement $ value = (array) $ value; Rien ne se passerait si $ value était déjà un tableau, sinon il deviendrait un tableau. –

+0

@Rupert, c'est aussi une excellente idée, qui accomplit essentiellement la même chose dans moins d'espace (et peut-être plus rapidement si ce serait un problème). :) –

Questions connexes