Foros del Web » Programando para Internet » PHP »

La mejor manera de detectar si existe un NEXT?

Estas en el tema de La mejor manera de detectar si existe un NEXT? en el foro de PHP en Foros del Web. Hola. Quiero justamente hacer lo que se explica en [ http://php.net/key] solo que allí se imprime erradamente un <br /> al final: Código: fruta1<br /> ...
  #1 (permalink)  
Antiguo 11/10/2013, 11:21
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 9 meses
Puntos: 22
La mejor manera de detectar si existe un NEXT?

Hola.

Quiero justamente hacer lo que se explica en [http://php.net/key] solo que allí se imprime erradamente un <br /> al final:
Código:
fruta1<br />
fruta4<br />
fruta5<br />
Lo que realmente en un contexto "estricto" deberia ser
Código:
fruta1<br />
fruta4<br />
fruta5
sin ése último <br />.

Se puede hacer utilizando/evaluando la existencia de un next()?

¿cómo ddeberia hacerse para NO imprimir ese "separador" que en el último elemento no debe existir?

Si tengo el ARRAY('a','b','c','d','e','f') y quiero imprimirlo separando los elementos por [comas y un espacio], hago:
Código PHP:
foreach(ARRAY('a','b','c','d','e','f') AS $L){
    echo 
$L;
    echo 
', ';
    } 
Pero al final tengo una coma y un espacio que no deben existir, los cuales con substr u otros métodos puedo "corregir", sin embargo no es lo idóneo.

¿cómo evaluo entonces que "YA NO EXISTE" un next?
  #2 (permalink)  
Antiguo 11/10/2013, 11:50
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 11 años, 3 meses
Puntos: 55
Respuesta: La mejor manera de detectar si existe un NEXT?

Hola, puedes usar implode().

Código PHP:
Ver original
  1. $a=ARRAY('a','b','c','d','e','f');
  2. $b=implode(', ',$a);
  3. echo $b;

Saludos
  #3 (permalink)  
Antiguo 11/10/2013, 11:56
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 9 meses
Puntos: 22
Respuesta: La mejor manera de detectar si existe un NEXT?

Cita:
Iniciado por Erick_MD9 Ver Mensaje
Hola, puedes usar implode().
Gracias Erick_MD9 no debo utilizar IMPLODE(), para el código que escribo requiero utilizar for().

No comprendo por que aquí falla:
Código PHP:
$A=ARRAY('a','b','c','d','e','f');
foreach(
$A AS $L){
    echo 
$L;
    if(
next($A))echo ', ';
    } 
  #4 (permalink)  
Antiguo 11/10/2013, 12:05
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 11 años, 3 meses
Puntos: 55
Respuesta: La mejor manera de detectar si existe un NEXT?

Cita:
Iniciado por Anarko Ver Mensaje
Gracias Erick_MD9 no debo utilizar IMPLODE(), para el código que escribo requiero utilizar for().

No comprendo por que aquí falla:
Código PHP:
$A=ARRAY('a','b','c','d','e','f');
foreach(
$A AS $L){
    echo 
$L;
    if(
next($A))echo ', ';
    } 
Por que no puedes usar implode()?

Ojo, para trabajar con next(), debes trabajar el puntero del array.

Eso lo puedes hacer con un bucle infinito.
Colocandole una salida apropiada (logicamente).
Y debes usar current().
Código PHP:
while(1==1){
    
current($array);
    
next($array);

Aún así, creo que te estas ahogando en un vaso de agua.

Saludos.
  #5 (permalink)  
Antiguo 11/10/2013, 12:10
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 9 meses
Puntos: 22
Respuesta: La mejor manera de detectar si existe un NEXT?

Cita:
Iniciado por Erick_MD9 Ver Mensaje
Por que no puedes usar implode()?
Por lo que menciono en el título del post: detectar si existe un NEXT?
Cita:
Iniciado por Erick_MD9 Ver Mensaje
creo que te estas ahogando en un vaso de agua.
Debo hacer un FOR, no un implode.
  #6 (permalink)  
Antiguo 11/10/2013, 12:32
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 4 meses
Puntos: 793
Respuesta: La mejor manera de detectar si existe un NEXT?

Usa end en vez de next.

Código PHP:
Ver original
  1. if (end($A) != $L) echo ', ';
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #7 (permalink)  
Antiguo 11/10/2013, 12:37
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 11 años, 3 meses
Puntos: 55
Respuesta: La mejor manera de detectar si existe un NEXT?

Cita:
Iniciado por andresdzphp Ver Mensaje
Usa end en vez de next.

Código PHP:
Ver original
  1. if (end($A) != $L) echo ', ';
Hola Andres, end() no funcionara si tienes un array con valores iguales.

Ejemplo.

$a=array('a','b','a','b');


Saludos
  #8 (permalink)  
Antiguo 11/10/2013, 12:50
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 11 años, 3 meses
Puntos: 55
Respuesta: La mejor manera de detectar si existe un NEXT?

Hola, siguiendo la esctructura que tienes, una solucion sería así.

Código PHP:
Ver original
  1. $a=ARRAY('a','b','c','d','e','f');
  2. $num1=count($a);
  3. foreach($a AS $L){
  4.     $num2++;
  5.     echo $L;
  6.     if( $num2 < $num1 ){ echo ', '; }
  7. }

Saludos
  #9 (permalink)  
Antiguo 11/10/2013, 12:52
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 4 meses
Puntos: 793
Respuesta: La mejor manera de detectar si existe un NEXT?

Cita:
Iniciado por Erick_MD9 Ver Mensaje
Hola Andres, end() no funcionara si tienes un array con valores iguales.
Así es pero funciona para este caso, también podría ser:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $A = ARRAY ('a', 'b', 'c', 'b', 'e', 'c');
  4. $i = 0;
  5. $num = count($A);
  6. foreach ($A as $L) {
  7.     echo $L;
  8.     if  ($i!=$num-1) echo ', ';
  9.     $i++;
  10. }

En su caso te falta definir la variable $num2.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #10 (permalink)  
Antiguo 11/10/2013, 12:53
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 9 meses
Puntos: 22
Respuesta: La mejor manera de detectar si existe un NEXT?

Cita:
Iniciado por andresdzphp Ver Mensaje
Usa end en vez de next.
Gracias AndresDZphp.Puedes ver que no funcionan ninguno de los siguientes:
Código PHP:
$A=ARRAY('a','b','c','d','e','f','f','f','f');
foreach(
$A AS $L){
    echo 
$L;
    if(
end($A)!=$L)echo ', ';
    }
echo 
str_repeat("\n",1);
foreach(
$A AS $L){
    echo 
$L;
    if(
current($A)!=end($A))echo ', ';
    } 
E intentado muchos condicionales, incluso mira este:
Código PHP:
foreach($A AS $L){
    echo 
$L;
    if(
current($A)===end($A))echo '! ';
    } 
Y no logro hallar la manera optimizar el for().

Como digo en el mensaje original:

Quiero justamente hacer lo que se explica en http://php.net/key solo que allí se imprime erradamente un <br /> al final:
Código:
fruta1<br />
fruta4<br />
fruta5<br />
Lo que en un contexto "optimizado" léase mejor eficiente/lógico/correcto deberia ser
Código:

fruta1<br />
fruta4<br />
fruta5
  #11 (permalink)  
Antiguo 11/10/2013, 13:12
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 4 meses
Puntos: 793
Respuesta: La mejor manera de detectar si existe un NEXT?

y no puedes usar array_keys? algo así:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $A = array('a', 'b', 'c', 'b', 'e', 'c');
  4.  
  5. foreach ($A as $K => $L) {
  6.     echo $L;
  7.     $KE = array_keys($A);
  8.     if  (end($KE) !== $K) echo ', ';
  9. }
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #12 (permalink)  
Antiguo 11/10/2013, 13:20
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 9 meses
Puntos: 22
Respuesta: La mejor manera de detectar si existe un NEXT?

Cita:
Iniciado por andresdzphp Ver Mensaje
y no puedes usar array_keys?
Gracias por la ayuda AndresdzPHP.

Creo que de tus dos soluciones es más velóz la primera:
Código PHP:
$A=ARRAY('a','b','c','d','e','f','f','f','f','f','f','f','f','f','f','f','f','f','f','f','f');
$i 0;
$num count($A);
foreach (
$A as $L) {
    echo 
$L;
    if  (
$i!=$num-1) echo ', ';
    
$i++;

Sin embargo retomado DOS puntos de mi mensaje:

1// Seria entonces esta la mejor manera de detectar si existe un próximo elemento?
2// ¿cómo se aplica al ejemplo que cítan en http://php.net/key ? es decir:
Código PHP:
<?php
$array 
= array(
    
'fruta1' => 'manzana',
    
'fruta2' => 'naranja',
    
'fruta3' => 'uva',
    
'fruta4' => 'manzana',
    
'fruta5' => 'manzana');

// Este ciclo muestra todas las claves del array asociativo
// donde el valor equivale a "manzana"
while ($nombre_fruta current($array)) {
    if (
$nombre_fruta == 'manzana') {
        echo 
key($array).'<br />';
    }
    
next($array);
}
?>
inicialmente creí que se haria una comparación utilizando next, current, o key...

¿que opinan?
  #13 (permalink)  
Antiguo 11/10/2013, 13:22
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 4 meses
Puntos: 793
Respuesta: La mejor manera de detectar si existe un NEXT?

Yo prefiero usar implode y no "reinventar la rueda", pero aquí tienes otro ejemplo con las clases SPL que si permite consultar si existe un próximo elemento:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $A = array('a', 'b', 'c', 'b', 'e', 'c', 'a' , 'b');
  4. $cit = new CachingIterator(new ArrayIterator($A));
  5.  
  6. foreach ($cit as $value) {
  7.     echo $value;
  8.     if ($cit->hasNext()) echo ', ';
  9. }

En tu ejemplo podría ser algo así:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $array = array(
  4.     'fruta1' => 'manzana',
  5.     'fruta2' => 'naranja',
  6.     'fruta3' => 'uva',
  7.     'fruta4' => 'manzana',
  8.     'fruta5' => 'manzana');
  9.  
  10. while ($nombre_fruta = current($array)) {
  11.     echo key($array);
  12.     if (next($array) !== false) echo ', ';
  13. }

Edito: No me acordaba que next devuelve false, si no existe un next.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Última edición por andresdzphp; 11/10/2013 a las 13:36
  #14 (permalink)  
Antiguo 11/10/2013, 13:34
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 9 meses
Puntos: 22
Respuesta: La mejor manera de detectar si existe un NEXT?

Cita:
Iniciado por andresdzphp Ver Mensaje
Yo prefiero usar implode
En mi caso no puede hacerse. Debo utilizar un FOR().

Así las cosas, me quedo con tu ejemplo #1.

Gracias a todos por colaborarme.
  #15 (permalink)  
Antiguo 11/10/2013, 13:45
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: La mejor manera de detectar si existe un NEXT?

Hay otra opción más sencilla, sin condicionales y solo una variable extra:

Código PHP:
Ver original
  1. $array = array(1, 3, 5, 7, 11, 13, 17);
  2. $separa = '';
  3. foreach($array as $num) {
  4.       echo "$separa$num";
  5.       $separa = "<br />\n";
  6. }

La idea es colocar los caracteres de separación antes del elemento, por supuesto, evitando hacerlo en la primera iteración.

Con eso obtienes la salida como la necesitas.
__________________
- León, Guanajuato
- GV-Foto

Última edición por Triby; 11/10/2013 a las 14:03 Razón: $echo sin $
  #16 (permalink)  
Antiguo 11/10/2013, 13:49
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 4 meses
Puntos: 793
Respuesta: La mejor manera de detectar si existe un NEXT?

También es buena idea Triby, falto decir que recuerda que foreach no es lo mismo que for, que sería:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $arr = array('a','b','c','d','e','f');
  4.  
  5. for ($i = 0, $j = count($arr); $i < $j; $i++) {
  6.     echo $arr[$i];
  7.     if ($j-1 != $i) echo ', ';
  8. }

mil formas de hacer la misma cosa jajaja.

De nada, saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #17 (permalink)  
Antiguo 11/10/2013, 14:03
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 11 años, 3 meses
Puntos: 55
Respuesta: La mejor manera de detectar si existe un NEXT?

Hola, aporto otra solución para el mismo problema, en caso de que sean arrays multidimensionales.

Código PHP:
Ver original
  1. $input=ARRAY('a','a',
  2.             array('b','c'),
  3.             array('d','e'),
  4.             'd','e','f'
  5.             );
  6. $arrayiter = new RecursiveArrayIterator($input);
  7. $iterator = new RecursiveIteratorIterator($arrayiter);
  8. $iterator->next();
  9. while( $iterator->valid() ){
  10.     echo $iterator->current();
  11.     $iterator->next();
  12.     if( $iterator->valid() ) { echo ', ';}
  13. }

Saludos

Última edición por Erick_MD9; 11/10/2013 a las 14:10
  #18 (permalink)  
Antiguo 12/10/2013, 13:07
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: La mejor manera de detectar si existe un NEXT?

Mi duda con Anarko es ¿por qué esa insistencia con el for?
__________________
Ayúdame a hacerlo por mi mismo.
  #19 (permalink)  
Antiguo 12/10/2013, 17:24
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 7 meses
Puntos: 270
Respuesta: La mejor manera de detectar si existe un NEXT?

Código PHP:
Ver original
  1. $arr = array('a','b','c','d','e','f');
  2. echo $arr[0];
  3. for ($i = 1;$i <count($arr); $i++)
  4.     echo ", ".$arr[$i];
  #20 (permalink)  
Antiguo 14/10/2013, 11:17
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 9 meses
Puntos: 22
Respuesta: La mejor manera de detectar si existe un NEXT?

Cita:
Iniciado por Erick_MD9 Ver Mensaje
Por que no puedes usar implode()?
Cita:
Iniciado por andresdzphp Ver Mensaje
y no puedes usar array_keys?
Cita:
Iniciado por andresdzphp Ver Mensaje
Yo prefiero usar implode y no "reinventar la rueda"
Cita:
Iniciado por guardarmicorreo Ver Mensaje
Mi duda con Anarko es ¿por qué esa insistencia con el for?
Gracias también a quienes no he citado.

Lo que sucede es que necesito colocar TODOS los campos de una TABLA en un ARRAY.

De momento lo hago así:
Código PHP:
$this->info=$this->conexion->QUERY("SHOW FIELDS FROM `tabla`;"); 
Y construyo el ARRAY con vuestro código:
Código PHP:
                    $i=0;
                    
$this->kt1[0]='';
                    foreach(
$this->info AS $Field){
                        
$this->kt1[0].=$Field['Field'];
                        if(
$i!=$this->info->num_rows-1)$this->kt1[0].=',';
                        
$i++;
                        
$this->kt1[$i]=$Field['Field'];
                        } 
A final,
tengo en el índice [0] los campos separados por comas, y en el último índice, la CANTIDAD de campos.

Luego utilizo ESE ARRAY INFO para realizar acciones...

Como pueden ver, la mejor manera no es "implode" o "array_keys".

De momento creo que las mejores maneras son la que utilizo en el código (tomada de este POST), y la que plantea DashTrash.

¿que opinan ustedes?
  #21 (permalink)  
Antiguo 14/10/2013, 11:28
 
Fecha de Ingreso: febrero-2011
Mensajes: 108
Antigüedad: 13 años, 9 meses
Puntos: 4
Respuesta: La mejor manera de detectar si existe un NEXT?

Esto es imaginación amigo, algo como esto podria ser

Código:
$contador = 0;
foreach(ARRAY('a','b','c','d','e','f') AS $L){
    if ($contador ==0){
	echo $L;
	}else{
    echo ', '.$L;
	}
$contador++;
    }

Etiquetas: manera
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:57.