2010-05-02 4 views
2

Cela devrait être très basique, mais je suis un peu perplexe!foreach() gestion des erreurs - comment le faire ne rien faire?

Voici mon tableau:

$menu = array(
    'Home', 

    'Stuff'=>array(
    'Losta Stuff', 
    'Less Stuff', 
    'Ur moms stuff', 
    'FAQ' 
), 
    'Public Works' 

); 

Voici ma logique:

echo "<ol>\n"; 
foreach((array)$menu as $header) 
{ 
    echo ' <li><b>'.$header."</b><br />\n"; 
echo ' <ol>'; 
    foreach((array)$header as $headers) 
    { 
    echo ' <li>'.$headers.".</li>\n"; 
    } 
    echo ' </ol>'; 
} 
echo "</ol>\n"; 

Comme vous pouvez le voir, Maison et Travaux publics ne disposent pas de données dans le leur, donc j'obtenir un

Warning: Invalid argument supplied for foreach() in test.php on line ## 

Si j'ajoute (array) à $header comme ceci: foreach((array)$header as $headers), Il ne g me donne l'erreur, mais il affiche simplement le $header comme $headers (c.-à-d. Accueil - Maison, au lieu de la maison - rien).

Fondamentalement, si les données sont vides, je veux qu'il ne fasse rien!

+2

dont echo html !!! – Galen

+0

Je suppose que vous avez lu ceci: http://php.net/manual/fr/control-structures.foreach.php? Et avez-vous essayé de tester l'entrée avant d'appeler foreach()? –

+0

Pourquoi ne devriez-vous pas faire écho html? – Jared

Répondre

2

Vous devez tester si l'élément en cours que vous essayez d'echo est un tableau, ce qui peut être fait avec is_array, puis agir en conséquence. Quelque chose comme ce qui suit pourrait faire l'affaire.

<?php 

$menu = array(
    'Home', 
    'Stuff'=>array(
     'Losta Stuff', 
     'Less Stuff', 
     'Ur moms stuff', 
     'FAQ' 
    ), 
    'Public Works' 
); 

echo "<ol>\n"; 
foreach($menu as $menuName => $header) 
{ 
    if (!is_array($header)) 
    { 
     echo ' <li><b>'.$header."</b><br />\n"; 
    } 
    else 
    { 
     echo "<li><b>$menuName</b><ol>"; 
     foreach($header as $headers) 
     { 
      echo ' <li>'.$headers.".</li>\n"; 
     } 
     echo "</ol></li>"; 
    } 
} 
echo "</ol>\n"; 
+0

Merci - J'ai remarqué le problème avec la réponse originale tout à l'heure. Question cependant - quand je l'enveloppe dans une fonction (c'est-à-dire 'fonction menu()'), pourquoi me donne-t-il des erreurs? – Jared

+1

C'est difficile à dire sans savoir quelle erreur vous recevez. Je devine * c'est parce que vous avez '$ menu = array (...);' toujours en dehors de la fonction 'menu()'. Si c'est le cas, mettez global $ menu dans la première ligne de votre fonction afin que PHP sache où trouver le tableau. – icio

+0

oui c'était ça .. merci! – Jared

2

Je vois quelque chose comme ceci:

// your old menu was using keys for headers on "submenus" only 
// this one uses keys for headers for everything 
$menu = array(
    'Home'=>'Home', 
    'Stuff'=>array(
    'Losta Stuff', 
    'Less Stuff', 
    'Ur moms stuff', 
    'FAQ' 
), 
    'Public Works' => 'Public Works',  
); 
echo "<ol>\n"; 
foreach((array)$menu as $header => $items) 
{ 
    echo ' <li><b>'.$header."</b>"; 
    if (is_array($items)) { 
    echo "<br />\n"; 
    echo ' <ol>'; 
    foreach($items as $subhead) 
    { 
     echo ' <li>'.$subhead.".</li>\n"; 
    } 
    echo ' </ol>'; 
    } 
} 
echo "</ol>\n"; 

En utilisant is_array pour déterminer s'il y a plus d'options sous le menu en cours.

+0

C'était le tour merci! – Jared

+1

$ header ne devrait probablement pas être répercuté si c'était un tableau – Reece45

+0

@ AlReece45 vu qu'après coup;) - Modifié le tableau original légèrement - la solution de icio semble plus propre quand même avec le tableau original. – gnarf