Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Necesito solucionar problema warning con foreach

Estas en el tema de Necesito solucionar problema warning con foreach en el foro de PHP en Foros del Web. ¡Buenas! Tengo el siguiente warning: Warning: Invalid argument supplied for foreach() in [ruta-del-archivo] on line 32 El código es el siguiente: Código PHP: [HIGHLIGHT="PHP"] <?php ...
  #1 (permalink)  
Antiguo 02/07/2014, 10:47
 
Fecha de Ingreso: julio-2014
Ubicación: España
Mensajes: 24
Antigüedad: 9 años, 9 meses
Puntos: 1
Necesito solucionar problema warning con foreach

¡Buenas!

Tengo el siguiente warning:

Warning: Invalid argument supplied for foreach() in [ruta-del-archivo] on line 32

El código es el siguiente:
Código PHP:

[HIGHLIGHT="PHP"]
<?php
$nav 
= array("Manualidades básicas""Fofuchas""Literatura""Especiales"); // Menú principal
// Acceso a las secciones:
$dir_basicas "manualidades-basicas/";
$dir_fofuchas "fofuchas/";
$dir_literatura "literatura/";
$dir_especiales "especiales/";

// Acceso a las subsecciones:
$sub_basicas = array($dir_basicas."mandalas.php"$dir_basicas."marcapaginas.php"$dir_basicas."posavasos.php"$dir_basicas."pulseras-de-gomitas.php"); // Sub-menú del menú de Manualidades Básicas
$sub_fofuchas = array($dir_fofuchas."que-son-las-fofuchas.php"$dir_fofuchas."galeria-de-fofuchas.php"$dir_fofuchas."fofucha-personalizada.php"); // Sub-menú del menú de Fofuchas
$sub_literatura = array($dir_literatura."narrativa.php"$dir_literatura."relatos.php"$dir_literatura."poesias.php"); // Sub-menú de Literatura
$sub_especiales = array($dir_especiales."organitas.php"$dir_especiales."cuadros-con-mandalas.php"$dir_especiales."cuadros-personalizados.php"); // Sub-menú de Especiales

function submenu ($elemento) {
    global 
$sub_basicas$sub_fofuchas$sub_literatura$sub_especiales;
    
$sub;
    switch(
$elemento) {
        case 
"Manualidades básicas":
            
$sub $sub_basicas;
            break;
        case 
"Fofuchas":
            
$sub $sub_fofuchas;
            break;
        case 
"Literatura":
            
$sub $sub_literatura;
            break;
        default:
            
$sub $sub_especiales;
            break;
    };
    
    foreach (
$elemento as $e) {
        echo 
"<li>$e
                        <ul>"
;
            foreach (
$sub as $nombre => $dir) {
                    echo 
"<li><a href=\"$dir\">$nombre</a></li>
                            </ul>
                        </li>"
;
            }
    }
}

foreach (
$nav as $emp) { // $emp = elemento de menu principal
                            
submenu($emp);
}
?>
[/HIGHLIGHT]
Algunas veces entiendo con relativa facilidad la causa de los warnings y demás, pero éste se me resiste... Ojalá hubiese algún programa que te explicase el por qué de ese error...

En fin, ¿en qué consiste ese error? Y, sobre todo, ¿cómo puedo solucionarlo?

¡Gracias por adelantado!
  #2 (permalink)  
Antiguo 02/07/2014, 10:52
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 8 meses
Puntos: 194
Respuesta: Necesito solucionar problema warning con foreach

A submenu le estas mandando un string "Manualidades básicas" y luego quieres hacer un foreach del string...

Ese es el error, "Manualidades básicas" no es un areglo válido a recorrer.
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #3 (permalink)  
Antiguo 02/07/2014, 11:07
 
Fecha de Ingreso: julio-2014
Ubicación: España
Mensajes: 24
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: Necesito solucionar problema warning con foreach

¡Vaya! Pues me he quedado en blanco. Sigue saliéndome error así:

Código PHP:
Ver original
  1. $nav = array("Manualidades básicas", "Fofuchas", "Literatura", "Especiales"); // Menú principal
  2. // Acceso a las secciones:
  3. $dir_basicas = "manualidades-basicas/";
  4. $dir_fofuchas = "fofuchas/";
  5. $dir_literatura = "literatura/";
  6. $dir_especiales = "especiales/";
  7.  
  8. / Sub-menú de Manualidades Basicas:
  9. $basicas = array(
  10.     "Mandalas" => $sub_basicas[0],
  11.     "Marcapáginas" => $sub_basicas[1],
  12.     "Posavasos" => $sub_basicas[2],
  13.     "Pulseras de gomitas" => $sub_basicas[3]
  14.     );
  15. // Sub-menú de Fafuchas
  16. $fofuchas = array (
  17.     "¿Qué son las fofuchas?" => $sub_fofuchas[0],
  18.     "Galería de fofuchas" => $sub_fofuchas[1],
  19.     "Fofucha personalizada" => $sub_fofuchas[2])
  20.     ;
  21. // Sub-menú de Literatura Mística
  22. $literatura = array("Narrativa" => $sub_literatura[0],
  23.     "Relatos" => $sub_literatura[1],
  24.     "Poesía" => $sub_literatura[2]
  25.     );
  26. // Submenú de Especiales
  27. $especiales = array("Organitas" => $sub_especiales[0],
  28.     "Cuadros con mandalas" => $sub_especiales[1],
  29.     "Cuadros personalizados" => $sub_especiales[2]
  30.     );
  31.  
  32. // Acceso a las subsecciones:
  33. $sub_basicas = array($dir_basicas."mandalas.php", $dir_basicas."marcapaginas.php", $dir_basicas."posavasos.php", $dir_basicas."pulseras-de-gomitas.php"); // Sub-menú del menú de Manualidades Básicas
  34. $sub_fofuchas = array($dir_fofuchas."que-son-las-fofuchas.php", $dir_fofuchas."galeria-de-fofuchas.php", $dir_fofuchas."fofucha-personalizada.php"); // Sub-menú del menú de Fofuchas
  35. $sub_literatura = array($dir_literatura."narrativa.php", $dir_literatura."relatos.php", $dir_literatura."poesias.php"); // Sub-menú de Literatura
  36. $sub_especiales = array($dir_especiales."organitas.php", $dir_especiales."cuadros-con-mandalas.php", $dir_especiales."cuadros-personalizados.php"); // Sub-menú de Especiales
  37.  
  38. function submenu ($elemento) {
  39.     global $sub_basicas, $sub_fofuchas, $sub_literatura, $sub_especiales;
  40.     $sub;
  41.     switch($elemento) {
  42.         case "Manualidades básicas":
  43.             $sub = $sub_basicas;
  44.             break;
  45.         case "Fofuchas":
  46.             $sub = $sub_fofuchas;
  47.             break;
  48.         case "Literatura":
  49.             $sub = $sub_literatura;
  50.             break;
  51.         default:
  52.             $sub = $sub_especiales;
  53.             break;
  54.     };
  55.    
  56.     foreach ($elemento as $e) {
  57.         echo "<li>$e
  58.                         <ul>";
  59.             foreach ($sub as $nombre => $dir) {
  60.                     echo "<li><a href=\"$dir\">$nombre</a></li>
  61.                             </ul>
  62.                         </li>";
  63.             }
  64.     }
  65. }
  66.  
  67. foreach ($nav as $emp) { // $emp = elemento de menu principal
  68.                             submenu($emp);
  69. }

¿Cómo hago para asociar el elemento del menú principal con el submenú respectivo? ¡Me he quedado en blanco...
  #4 (permalink)  
Antiguo 02/07/2014, 11:17
 
Fecha de Ingreso: septiembre-2011
Mensajes: 176
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Necesito solucionar problema warning con foreach

Por que no usas un array dimensional para mostrar los submenu. http://www.php.net/manual/es/language.types.array.php o usa una base de datos con las relaciones entre menu y sub menu.

Espero que te ayude

Código PHP:

<?php
$nav 
= array("manualidadesbasicas"); 

$sub_basicas = array("mandalas.php""marcapaginas.php""posavasos.php""pulseras-de-gomitas.php"); 
$dir_basicas "manualidades-basicas/"
function 
submenu($elemento,$menu,$dir_basicas) {
    switch(
$elemento) {
        case 
"manualidadesbasicas":
           
$menu;
            break;
     
 
    };
    echo 
"<ul>";
    foreach (
$menu as $value) {

        
        echo 
'<li><a href='.$dir_basicas.$value.'>'.$value.'</a></li>';
        
    
        
    }
    echo 
"</ul>";
}

submenu("manualidadesbasicas",$sub_basicas,$dir_basicas);


?> 

?>
  #5 (permalink)  
Antiguo 02/07/2014, 11:19
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 8 meses
Puntos: 194
Respuesta: Necesito solucionar problema warning con foreach

Deberias usar un array asociativo como mencionan en la respuesta anterior, te detallo el error que estas cometiendo por si no quedo claro

Código PHP:
Ver original
  1. foreach ($nav as $emp) {
  2.                             submenu($emp); //Primer vuelta  $emp = "Manualidades básicas"
  3. }
  4.  
  5. function submenu ($elemento) { // $elemento = "Manualidades básicas"
  6.  
  7. foreach ($elemento as $e) { //foreach ( "Manualidades básicas" as $e) [B]error[/B]
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #6 (permalink)  
Antiguo 02/07/2014, 15:39
 
Fecha de Ingreso: julio-2014
Ubicación: España
Mensajes: 24
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: Necesito solucionar problema warning con foreach

Con el multiarray me hago un lío... ya lo había visto, pero me lío. Es más sencillo de lo que parece, pero cuando llevo un rato completándolo... me acabo liando. De hecho, sí he usado array asociativo, pero no con otros arrays dentro.

Pero esa respuesta me ha recordado, no sé por qué, a una posibilidad de crear un objeto que tenga esas propiedades. Bueno, 2 tipos de objetos. El objeto padre (los distintos elementos del menú principal) y el otro para el hijo (los distintos elementos de los submenúes)

El padre tendría:
- nombre
- directorio

Y el hijo tendría varios submenúes con: nombre, directorio y y directorio del padre:

- submenú 1 (debería poder tener tantos submenúes como hicieran falta... algunos son 3 y otros son 4)
- nombre
- directorio del padre
- directorio

o quizá los dos juntos, para que el directorio final sea...
- directorio del padre.directoriodelhijo (porque el hijo está en la carpeta del padre. El padre está en el index.php de una carpeta con su nombre o similar y el hijo es un archivo tipo "nombre-del-hijo.php" que está dentro de la carpeta del padre. O sea, junto con el index.php de dicha carpeta.

Pero creo que me he metido en un berengenal... Me he hecho un lío... ¿podríais ayudarme?

El caso es que quiero que la función ponga las listas y sub-listas de cada apartado de la lista principal. Vamos, que haga la barra de navegación automáticamente simplificando código.

Pero creo que esto es demasiado para mí... ¿podéis ayudarme a hacerlo?
  #7 (permalink)  
Antiguo 04/07/2014, 04:12
 
Fecha de Ingreso: julio-2014
Ubicación: España
Mensajes: 24
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: Necesito solucionar problema warning con foreach

Ya está... He visto mi error. Le mandaba "$sub_basicas" en lugar de "$basicas". En la que le mandaba, sólo tenía las direcciones. En cambio, en la otra tenía ambas en un array asociativo (el nombre y la dirección, extraida de su posición en la variable que por error le mandaba)
He tenido que incluir todas esas variables en la función, para que fuesen globales, cambiando las que tenían el "sub_" y añadiento las que tenían "dir_" y la propia "nav". Quizá de ahí venía también el error. Del hecho de que le enviaba el nav simplemente... y usaba como referencia las variables equivocadas.

Ahora está así la función, pero me gustaría saber, antes de darlo por solucionado, si se puede ahorrar código.

Fuera de la función: exactamente igual, solo que ahora no son necesarios los parámetros...)

La función:

Código PHP:
Ver original
  1. function submenu () {
  2.     global $nav, $basicas, $fofuchas, $literatura, $especiales, $dir_basicas, $dir_fofuchas, $dir_literatura, $dir_especiales;
  3.     $sub;
  4.     $dir;
  5.     foreach ($nav as $e) {
  6.         switch($e) {
  7.             case "Manualidades básicas":
  8.                 $sub = $basicas;
  9.                 $dir = $dir_basicas;
  10.                 break;
  11.             case "Fofuchas":
  12.                 $sub = $fofuchas;
  13.                 $dir = $dir_fofuchas;
  14.                 break;
  15.             case "Literatura":
  16.                 $sub = $literatura;
  17.                 $dir = $dir_literatura;
  18.                 break;
  19.             default:
  20.                 $sub = $especiales;
  21.                 $dir = $dir_especiales;
  22.                 break;
  23.             };
  24.             echo "<li><a href=\"$dir\">$e</a>
  25.                             <ul>";
  26.                 foreach ($sub as $nombre => $direccion) {
  27.                         echo "<li><a href =\"$direccion\">$nombre</a></li>";
  28.                 }
  29.             echo "      </ul>
  30.                     </li>"; }
  31. }

Última edición por LordYo; 04/07/2014 a las 04:21 Razón: Correcciones menores...

Etiquetas: foreach, solucionar, warning
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:28.