Foros del Web » Programando para Internet » PHP »

Problema con if en arreglo de un solo elemento.

Estas en el tema de Problema con if en arreglo de un solo elemento. en el foro de PHP en Foros del Web. Hola, buenas a la comunidad de PHP. Tengo la siguiente consulta que no he podido mejorar en mucho tiempo. Les explico: Tnego un arreglo, el ...
  #1 (permalink)  
Antiguo 26/06/2013, 17:17
 
Fecha de Ingreso: abril-2011
Mensajes: 66
Antigüedad: 13 años
Puntos: 7
Problema con if en arreglo de un solo elemento.

Hola, buenas a la comunidad de PHP.

Tengo la siguiente consulta que no he podido mejorar en mucho tiempo. Les explico:

Tnego un arreglo, el cual cuando lo genero, tiene un solo elemento, este array es asociativo. Por ejemplo:

Código:
ROW  nombre  rut    telefono
1    Juan    111     547896

ese array se almacena en la variable $persona, entonces quedaria como array asociativo, asi si quiero acceder al nombre de la persona, tengo que acceder al dato como:
$persona[0]['nombre']
Al tener ese array, cuando lo recorro por ejemplo con un for, si es un solo registro, no me recorre, debido a que el for lo declaro de la siguiente manera (mostrare todos los pasos que realizo y explicare porque):

Código PHP:
Ver original
  1. $contador = count($persona); //esta variable se utiliza como contador de los registros que contiene el array
  2. for($i=i;$i<$contador;$i++){
  3.  
  4. // senetncias dentro del ciclo for
  5.  
  6. }

El problema es que como es un registro, no me recorre y se salta, pero se me olvido mencionar que esto lo relizo porque pueden ser un solo registro, o mas de uno, o cero, en caso de no existir informacion.

La consulta mia es como puedo mejorar la declaracion del ciclo for, para que cuando exista aunque sea un registro, el ciclo funcione (las senetncias contenidas funcionen).

Eso es, espero haberme explicado con claridad.

Saludos.
  #2 (permalink)  
Antiguo 26/06/2013, 17:32
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Problema con if en arreglo de un solo elemento.

Código PHP:
Ver original
  1. for($i=0;$i<=$contador;$i++){
  2.      
  3.     // senetncias dentro del ciclo for
  4.      
  5.     }
  #3 (permalink)  
Antiguo 26/06/2013, 17:37
Avatar de pzin
Moderata 😈
 
Fecha de Ingreso: julio-2002
Ubicación: Islas Canarias
Mensajes: 10.488
Antigüedad: 21 años, 8 meses
Puntos: 2114
Respuesta: Problema con if en arreglo de un solo elemento.

¿No sería más conveniente y fácil usar un foreach() en lugar de for()?
  #4 (permalink)  
Antiguo 26/06/2013, 17:53
 
Fecha de Ingreso: abril-2011
Mensajes: 66
Antigüedad: 13 años
Puntos: 7
Respuesta: Problema con if en arreglo de un solo elemento.

Cita:
Iniciado por enlinea777 Ver Mensaje
Código PHP:
Ver original
  1. for($i=0;$i<=$contador;$i++){
  2.      
  3.     // senetncias dentro del ciclo for
  4.      
  5.     }
Hola enlinea777. Tu solucion propuesta tambien la habia probado, pero te explico. Lo que hago con ese ciclo for es escribir datos en una hoja excel. entonces al momento de querer escribir los datos y llegar al ultimo dato del array, si por ejemplo lo hago como dices, me tendria que escribir una celda en blanco, porque ese registro no existe, puesto que si tengo el array que contiene por ejemplo 3 registros, normalmente comienzo del 0, luego el 1, y luego el 2 que seria el ultimo registro. De lo contrario tendria que agregarle el 3, pero con que registros, si en arreglo al tratar de ubicar el cuarto registro, no existe, por lo tanto me devuelve una celda totalmente vacia, y eslo que quiero tratar de evitar.

Cita:
¿No sería más conveniente y fácil usar un foreach() en lugar de for()?
Siempre y cuando no me ocasione el problema que le respondí a usuario enlinea777, pero seria una buena opción.

Saludos.
  #5 (permalink)  
Antiguo 26/06/2013, 18:00
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Problema con if en arreglo de un solo elemento.

@pzin: el problema de foreach() como bien dice @max_mouse699 es que tienes que preguntar antes si no hay un arreglo vacio (empty o null)pues explota

Creeria es un BUG no-solucionado y bien viejo pues esa simple comparacion no lo hace ineficiente y nos ahorraria muchos problemas. Ademas, NULL fue implementado pensando en no generar justamente este tipo de problemas.

Sin embargo, investigando encontre alguien reporto un HACK para esto:

Código PHP:
<?php
  $items 
null;

 foreach((array) 
$items as $item) {
    print 
$item;
  }
Notar el casting a 'array' con (array)
__________________
Salu2!

Última edición por Italico76; 26/06/2013 a las 18:16
  #6 (permalink)  
Antiguo 26/06/2013, 18:48
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: Problema con if en arreglo de un solo elemento.

A menos que un arreglo lo empieces por el índice 1 explícitamente, saltándote el 0, siempre se debe recorrer un arreglo desde la posición 0.

El foreach sería más eficiente de usar si desconocemos la longitud del arreglo, simplemente preguntando si existe o si tiene datos.

Sería conveniente saber cómo obtienes los datos de arreglo para ver cuál sería la mejor manera de "preguntar" sobre el arreglo antes de recorrerlo.
  #7 (permalink)  
Antiguo 27/06/2013, 08:37
 
Fecha de Ingreso: abril-2011
Mensajes: 66
Antigüedad: 13 años
Puntos: 7
Respuesta: Problema con if en arreglo de un solo elemento.

Cita:
El foreach sería más eficiente de usar si desconocemos la longitud del arreglo, simplemente preguntando si existe o si tiene datos.
El dilema esta en que tal cual como tu indicas, yo necesito conocer la longitud del arreglo, porque con ese valor hago otros procesos de formateo de la hoja excel, y ademas necesito conocer el ultimo valor con el que termina de escribir los datos, o sea, el ultimo valor de la fila en el arreglo.

Cita:
Sería conveniente saber cómo obtienes los datos de arreglo para ver cuál sería la mejor manera de "preguntar" sobre el arreglo antes de recorrerlo.
Lo que obtengo es un array de tipo asociativo, porque asi tengo el control de la fila y la columna de la cual estoy preguntando. Es de tipo $variable[$indice]['columna'], ya todos deben saber los valores que van contenido en cada una de las variables.

Al querer recorrer este array, tengo que conocer el valor del largo total del array, y asi poder recorrerlo mejor, pero el problema se me presenta, como lo mencione al comienzo, cuando tengo un solo registro en mi array, simplemente no me lo escribe, porque la condicion en el for seria:

Código PHP:
Ver original
  1. for($i=0;$i<$largo_array;$i++){
  2.  
  3. }

Y como la condicion es verdadera, el ciclo se corta de inmediato.

Cita:
Creeria es un BUG no-solucionado y bien viejo pues esa simple comparacion no lo hace ineficiente y nos ahorraria muchos problemas. Ademas, NULL fue implementado pensando en no generar justamente este tipo de problemas.

Sin embargo, investigando encontre alguien reporto un HACK para esto:
@Italico76: interesante tu solucion, pero como lo podria implementar en mi codigo ? que es lo que me imprimiria items ?

Saludos.
  #8 (permalink)  
Antiguo 27/06/2013, 08:42
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Problema con if en arreglo de un solo elemento.

Solucion:
Código PHP:
//LIMPIAR TU ARRAY
    
foreach($persona as $valor){
     if(
trim($valor)!=""){
          
$persona_nuevo[]=$valor;
      }
    }
//ahora tu sentencia
    
for($i=0;$i<=count($persona_nuevo);$i++){
        
// senetncias dentro del ciclo for
        

  #9 (permalink)  
Antiguo 27/06/2013, 08:52
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Problema con if en arreglo de un solo elemento.

No se porque dices que no entra al FOR ...pues preguntaria si 0<1 y es verdadero, asi lo cicla 1 vez:

Código PHP:
<?php

$array
=array('Uno');
$largo_array count($array);

for(
$i=0;$i<$largo_array;$i++){
   echo 
$array[$i];
}
__________________
Salu2!
  #10 (permalink)  
Antiguo 27/06/2013, 09:03
 
Fecha de Ingreso: abril-2011
Mensajes: 66
Antigüedad: 13 años
Puntos: 7
Respuesta: Problema con if en arreglo de un solo elemento.

Cita:
Iniciado por Italico76 Ver Mensaje
No se porque dices que no entra al FOR ...pues preguntaria si 0<1 y es verdadero, asi lo cicla 1 vez:

Código PHP:
<?php

$array
=array('Uno');
$largo_array count($array);

for(
$i=0;$i<$largo_array;$i++){
   echo 
$array[$i];
}
Y lo has probado con un array asociativo ? Te arroja los mmismo resultados ?
  #11 (permalink)  
Antiguo 27/06/2013, 09:25
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Problema con if en arreglo de un solo elemento.

Si es asociativo... seria mejor opcion asi:

Código PHP:
<?php

$arr 
= array ('nombre'=>'juan','apellido'=>'perez');
$it = new arrayIterator($arr);

foreach (
$it as $key=>$val){
   echo 
"$key : $val<br/>";
}
Pero puedes hacerlo perfecamente con FOR

Código PHP:
<?php

$arr 
= array ('nombre'=>'juan','apellido'=>'perez');

$largo_array count($arr);

for(
$i=0;$i<$largo_array;$i++){
   echo 
key($arr).': '.current($arr).'<br/>';
   
next($arr);
}
Logicamente no puedes referencias un elemento con un indice numerico ($i en el ejemplo tuyo) si es asociativo,...ahi la falla Por eso fijate uso current() next() ... key() si quiero el indice

VOLVIENDO a tu CASO PARTICULAR, creo tu tienes un array de arrays y no un array bi-dimensional como dices: $persona[0]['nombre']

En tal caso... el primer "bucle" seria con indice numerico y el interno es asociativo:

Código PHP:
<?php

// Simulamos un mysql_fech_array() en $datos
$datos = array();
$datos[] = array ('id'=>1,'nombre'=>'juan','apellido'=>'perez','telefono'=>'30045634455');
$datos[] = array ('id'=>2,'nombre'=>'pepe','apellido'=>'gonzalez','telefono'=>null);


$cant_catos count($datos);

for(
$row_ix=0;$row_ix<$cant_catos;$row_ix++){
   
$row $datos[$row_ix];
   foreach (
$row as $field=>$val){
       echo 
"$field : $val <br/>";
   }
}
Salida:

Cita:
id : 1
nombre : juan
apellido : perez
telefono : 30045634455
id : 2
nombre : pepe
apellido : gonzalez
telefono :
__________________
Salu2!

Última edición por Italico76; 27/06/2013 a las 10:10

Etiquetas: arreglo, registro
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 05:03.