Foros del Web » Programando para Internet » PHP »

PHP OO reemplazar foreach

Estas en el tema de reemplazar foreach en el foro de PHP en Foros del Web. hola a todos, tengo el siguiente codigo $posts = array(); $i = 0; foreach($a as $key => $value) { preg_match("#php\?sid=([0-9]+)#", $c[$i],$id); $id = $id[1]; $img ...
  #1 (permalink)  
Antiguo 26/04/2014, 09:07
 
Fecha de Ingreso: mayo-2007
Mensajes: 16
Antigüedad: 16 años, 11 meses
Puntos: 0
reemplazar foreach

hola a todos, tengo el siguiente codigo

$posts = array();
$i = 0;
foreach($a as $key => $value) {

preg_match("#php\?sid=([0-9]+)#", $c[$i],$id);
$id = $id[1];

$img = (strlen($b[$i])<20?'no':photo($b[$i]));
$img = preg_replace("#c([0-9]+).([0-9]+).([0-9]+).([0-9]+)#", '',$img);


sin embargo cuando lo ejecuto me sale lo siguiente

Warning: Invalid argument supplied for foreach() in /home/pagina/public_html/pagina.php on line 47


hay alguna forma de reemplazarlo, me han dicho que es por la versión de php, es cierto? gracias
  #2 (permalink)  
Antiguo 26/04/2014, 10:37
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: reemplazar foreach

En este caso, la versión de PHP no tiene nada que ver, probablemente $a no sea un array. Deja como comentarios el código que muestras y pega este para ver qué contenido tiene $a.

Código PHP:
Ver original 

Y luego muéstranos el resultado.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 26/04/2014, 11:12
 
Fecha de Ingreso: mayo-2007
Mensajes: 16
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: reemplazar foreach

Hola, si el codigo completo es el siguiente:

Código PHP:
<?php
include "header.php";
include 
"simple_html_dom.php";

$c getFanpage($fanpage);


libxml_use_internal_errors(true);
$dom = new domDocument;
$dom->loadHTML($c);
$dom->preserveWhiteSpace false;


function 
text($a){
    return (
strip_tags(str_replace("<br>""\n"$a)));
}


function 
photo($a){
    
preg_match("#src=\"(.*?)\"#",$a,$a);
    return 
$a[1];
}

function 
listDivsByClass($class){
    global 
$dom;
    
$xpath = new DomXpath($dom);
    
$div $xpath->query('//*[@class="'.$class.'"]');

    foreach (
$div as $element) {
        
$nodes $element->childNodes;
        foreach (
$nodes as $node) {
          
$a[] = $node->ownerDocument->saveHTML$node );
        }
    }

    return 
$a;
}


$a listDivsByClass('tlAboveUnit');
$b listDivsByClass('tlUnitContent');
$c listDivsByClass('tlBelowUnit');


$posts     = array();
$i         0;
 foreach(
$a as $key => $value) {

    
preg_match("#php\?sid=([0-9]+)#"$c[$i],$id);
    
$id $id[1];

    
$img = (strlen($b[$i])<20?'no':photo($b[$i]));
    
$img preg_replace("#c([0-9]+).([0-9]+).([0-9]+).([0-9]+)#"'',$img);


    
$titleee = ($value==''?':O':text($value));
    
$titleee preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@','',$titleee);


    
$posts[] = array(
                        
'title' => $titleee,
                        
'img'     => $img,
                        
'id'    => $id
                        
);
    
$i++;

    unset(
$img);
    unset(
$id);
    unset(
$titleee);

}



include(
"save.php");
yo decía o me quedaba la duda que si pudiera ser la versión de php por que , yo tengo un hosting de pago en hostgator Cpanel y me sale este error, he probado en varios hosting VPS Webuzo y también sale el mismo error , pero he probado en un hosting gratuito y si funciona , otras personas me han dicho que si funciona en sus hosting pero no quiero estas gastando inutilmente si se puede arreglar,
  #4 (permalink)  
Antiguo 26/04/2014, 11:21
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: reemplazar foreach

¿Hiciste lo que te indiqué en mi anterior respuesta?
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #5 (permalink)  
Antiguo 26/04/2014, 14:49
 
Fecha de Ingreso: mayo-2007
Mensajes: 16
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: reemplazar foreach

hola, si sale null
  #6 (permalink)  
Antiguo 26/04/2014, 15:29
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: reemplazar foreach

Ahí está el problema, como $a es null, no puedes tratarlo como un array, por eso aparece el mensaje de error. Al parecer, está ocurriendo un problema en la función listDivsByClass, revisa esa sección del código.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #7 (permalink)  
Antiguo 26/04/2014, 15:45
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: reemplazar foreach

En caso de que pudieras recibir NULL porque no hubiera datos que mostrar pero no fuera por error de programacion:

Código PHP:
Ver original
  1. foreach( (array) $a as $key => $value) {
  2.    // etc
  3. }

Con eso te libras de que el array si viene vacio (null) tengas un error

Ej:

Código PHP:
Ver original
  1. <?php
  2. $a = [];  // supongamos viene de una DB y no hay resultados de tu consulta
  3.  
  4. foreach((array) $a as $key => $val) {
  5.     echo "$key : $val\n<br/>";
  6.     // ...
  7. }
  8.  
  9. # No produce ningun error :)
__________________
Salu2!
  #8 (permalink)  
Antiguo 26/04/2014, 16:23
 
Fecha de Ingreso: mayo-2007
Mensajes: 16
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: reemplazar foreach

Cita:
Iniciado por Italico76 Ver Mensaje
En caso de que pudieras recibir NULL porque no hubiera datos que mostrar pero no fuera por error de programacion:

Código PHP:
Ver original
  1. foreach( (array) $a as $key => $value) {
  2.    // etc
  3. }

Con eso te libras de que el array si viene vacio (null) tengas un error

Ej:

Código PHP:
Ver original
  1. <?php
  2. $a = [];  // supongamos viene de una DB y no hay resultados de tu consulta
  3.  
  4. foreach((array) $a as $key => $val) {
  5.     echo "$key : $val\n<br/>";
  6.     // ...
  7. }
  8.  
  9. # No produce ningun error :)
muchas gracias, si me funciona,
  #9 (permalink)  
Antiguo 26/04/2014, 18:06
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: reemplazar foreach

jeje... me alegro.. lo que haces con eso se llama casting: conviertes NULL en array()
__________________
Salu2!
  #10 (permalink)  
Antiguo 26/04/2014, 18:11
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: reemplazar foreach

Creo que lo más conveniente sería verificar que si el array es nulo, no realizar el bucle, pues sería innecesario. La función count te puede ayudar para saber eso.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #11 (permalink)  
Antiguo 27/04/2014, 16:34
 
Fecha de Ingreso: mayo-2007
Mensajes: 16
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: reemplazar foreach

Cita:
Iniciado por Alexis88 Ver Mensaje
Creo que lo más conveniente sería verificar que si el array es nulo, no realizar el bucle, pues sería innecesario. La función [URL="http://www.php.net/manual/es/function.count.php"][B]count[/B][/URL] te puede ayudar para saber eso.
Gracias, lo hare
  #12 (permalink)  
Antiguo 27/04/2014, 16:47
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: reemplazar foreach

Cita:
Iniciado por rufoqe Ver Mensaje
Gracias, lo hare
Logicamente que no hay ciclado del foreach si el array esta vacio.... pues es muy parecido a un un for en su implmentacion:

Código PHP:
for ($i=0;$i<count($array);$i++)
{
    
# ...

El unico problema es que NULL no pertenece a ningun tipo en particular y por eso foreach queda todo confundido cuando encuentra NULL y el casting lo resuelve.

Por lo dicho... excepto que las keys sean no-numericas es lo mismo que...

Código PHP:
Ver original
  1. <?php
  2. $a = [];  // supongamos viene de una DB y no hay resultados de tu consulta
  3.  
  4. for ($key=0;$key<count($a);$key++)
  5.     echo "$key : ".$a[$key]."\n<br/>";
  6.     // ...
  7. }
  8.  
  9. # No produce ningun error :)

Y la misma vaina se puede hacer con while ()
__________________
Salu2!
  #13 (permalink)  
Antiguo 27/04/2014, 17:05
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: reemplazar foreach

Claro, la solución para este caso es la conversión de tipo de null a un array vacío, pero ya en términos generales, es preferible verificar el tamaño del array antes de iterarlo. Es una buena práctica pues he visto muchos (pero muchos) casos de personas que no entendían el porque se producía un error al momento de iterar un array luego de una búsqueda de datos en la BD, cuando dicha búsqueda solía no devolver dato alguno. Es más por seguir una buena práctica, porque, como dije, la solución para este caso, es la conversión de tipo.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Etiquetas: foreach
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 01:43.