Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Arrays sin guión al principio

Estas en el tema de Arrays sin guión al principio en el foro de PHP en Foros del Web. Hola amigos de esta comunidad productiva. Les ruego su ayuda porque ya estoy quedando pelado tanto reventarme para ver cómo poder ordenar estos arrays a ...

  #1 (permalink)  
Antiguo 25/08/2013, 02:02
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Arrays sin guión al principio

Hola amigos de esta comunidad productiva. Les ruego su ayuda porque ya estoy quedando pelado tanto reventarme para ver cómo poder ordenar estos arrays a mi antojo.

El tema es que tengo esta función:

Código PHP:
function get_tree($id$level 0)
{
    
$result mysql_query('SELECT id, label FROM menu WHERE parent='.$id);
    while (
$row mysql_fetch_array($result))
    {
        echo 
str_repeat('-'1), $row['label'], "\r\n";
    
        
get_tree($row['id'], $level 1);
    }
}

echo 
get_tree(6,1); 

como resultado (por ejemplo):

- Archive - Snippet

El asunto es que necesito que el resultado salga de esta manera: (sin el guión al principio):

Archive - Snippet


Ya probé con implode()... No sé cómo solucionarlo.
  #2 (permalink)  
Antiguo 25/08/2013, 09:30
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Arrays sin guión al principio

Cita:
Iniciado por mikehove Ver Mensaje
Hola amigos de esta comunidad productiva. Les ruego su ayuda porque ya estoy quedando pelado tanto reventarme para ver cómo poder ordenar estos arrays a mi antojo.

El tema es que tengo esta función:

Código PHP:
function get_tree($id$level 0)
{
    
$result mysql_query('SELECT id, label FROM menu WHERE parent='.$id);
    while (
$row mysql_fetch_array($result))
    {
        echo 
str_repeat('-'1), $row['label'], "\r\n";
    
        
get_tree($row['id'], $level 1);
    }
}

echo 
get_tree(6,1); 

como resultado (por ejemplo):

- Archive - Snippet

El asunto es que necesito que el resultado salga de esta manera: (sin el guión al principio):

Archive - Snippet


Ya probé con implode()... No sé cómo solucionarlo.

prueba así

Código PHP:
Ver original
  1. function get_tree($id, $level = 0)
  2. {
  3.     $result = mysql_query('SELECT id, label FROM menu WHERE parent='.$id);
  4.     while ($row = mysql_fetch_array($result))
  5.     {
  6.         echo $row['label'].str_repeat('-', 1)."\r\n"; //si necesitas salto de linea además de \r\n, para que se vea en html agrégale <br>
  7.    
  8.         get_tree($row['id'], $level + 1);
  9.     }
  10. }
  11.  
  12. echo get_tree(6,1);
__________________
Ayúdame a hacerlo por mi mismo.
  #3 (permalink)  
Antiguo 25/08/2013, 10:45
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Arrays sin guión al principio

Buenas "Guardarmicorreo". Gracias por responder.

Probé y su resultado fue:
Código PHP:
ArchiveSnippet
Sí funcionó sacarle el guión del principio. Buenísimo!

¿Habrá alguna manera para evitar el último guión? Quedando así:
Código PHP:
ArchiveSnippet 
  #4 (permalink)  
Antiguo 25/08/2013, 11:17
 
Fecha de Ingreso: agosto-2013
Mensajes: 150
Antigüedad: 10 años, 8 meses
Puntos: 29
Respuesta: Arrays sin guión al principio

Prueba implode()
Código PHP:
Ver original
  1. $array=array('key1'=>'valor1','key2'=>'valor2','key3'=>'valor3');
  2.  
  3. echo implode('-',$array);

Rdo:
valor1-valor2-valor3
  #5 (permalink)  
Antiguo 25/08/2013, 11:41
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Arrays sin guión al principio

Pruebo de este modo:

Antes probando ese método no tuve éxito.

Ahora pruebo así:

Código PHP:
 echo $row['label'].implode('-',$row); 
y su resultado es:
Código PHP:
Archive8-8-Archive-ArchiveSnippet9-9-Snippet-Snippet 
Logra el objetivo de que no aparezca el guión al principio ni al final, pero la estoy errando.

¿Sabes qué? Me confunde el hecho de trabajar con la BD. Quizás esté fallando la variable dentro de esa línea.
  #6 (permalink)  
Antiguo 25/08/2013, 12:01
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Arrays sin guión al principio

Claro que la estás errando, ¿si sabes lo que hace implode() exactamente?

Dicha función sirve para unir valores de un array mediante un separador:
Código PHP:
Ver original
  1. // MAL
  2. while (/* ... */) {
  3.   echo 'bar'.implode('-', $foo);
  4. }
  5.  
  6. // BIEN
  7. $foo = array();
  8.  
  9. while (/* ... */) {
  10.   $foo []= 'bar';
  11. }
  12.  
  13. echo implode(', ', $foo); // bar, bar, bar

¿Se entiende?

Ahora, tu necesitas imprimir una serie de valores separados por un guión entonces implode() es exactamente lo que necesitas, pero hay un inconveniente: al parecer no sabes usar arrays.

Ese es el más grave de tus problemas, puedes usar las funciones incorrectas todo el tiempo que quieras, si no comprendes lo que tienes que hacer ni lees el manual de las funciones que usas, ¿cómo sabes que las estás usando correctamente?

El que trabajes con datos de la BD es lo más trivial del asunto, el hecho es que ni siquiera sabes trabajar correctamente con variables de tipo array + strings.

La clave consiste en no imprimir los valores, sino acumularlos en un array para después, al final del ciclo, imprimirlos usando implode().

Pon atención en eso.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Última edición por pateketrueke; 25/08/2013 a las 12:20
  #7 (permalink)  
Antiguo 25/08/2013, 12:41
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Arrays sin guión al principio

mikehove, pateketrueke ha sido lo suficientemente claro, voy a ir más allá planteándotelo desde otra perspectiva.

normalmente, cuando quieres imprimir texto estático dentro de un bucle junto a una variable, en tu caso usando while, se hace así

Código PHP:
Ver original
  1. while (/*cualquier condición*/)
  2. {
  3. echo $array['clave']. "-"; //aquí utilizas innecesariamente la función str_repeat();
  4. //¿sigues creyendo que necesitas hacer un echo $row['label']?
  5. }

en tu caso necesitas implode(); si te molestas en leer la documentación (algo que adecuadamente te ha insistido pateketrueke) verás que esta función separa los valores de un array. recibe dos parámetros, uno de ellos es opcional. este parámetro opcional si se especifica es un caracter string.

entonces si haces

Código PHP:
Ver original
  1. echo implode ("-", $array a separar);

los valores del array, independientemente si las claves son indexadas o asociativas serán imprimidas así:

Código PHP:
Ver original
  1. valor1-valor2-valor3-valor4 etc.
  2. //no se imprimen las claves.

entonces aquí hay tres cosas claras:

no necesitas un bucle para utilizar implode.

no necesitas una función como str_repeat(); para imprimir una sola vez en cada iteración un guión "-".

y

si quieres imprimir las claves no puedes hacerlo con echo $array['clave']; puesto que te imprimirá el valor.

ahora piensa qué cambios tienes que hacer en tu código para que te funcione tal y como quieres.
__________________
Ayúdame a hacerlo por mi mismo.
  #8 (permalink)  
Antiguo 27/08/2013, 00:01
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Arrays sin guión al principio

Gracias por escribirme amigos y enseñarme.
Estuve leyendo la documentación y disculpen todavía no encuentro el éxito que deseo.

Este es el resultado obtenido:

Código:
function get_tree($id, $level = 0)
{
    $result = mysql_query('SELECT id, label FROM menu WHERE parent='.$id);
        $guion = array();
    while ($row = mysql_fetch_array($result))
    {
          $guion[] = $row['label'];         
       get_tree($row['id'], $level + 1);		
    }
 echo implode(" > ", $guion);

}

echo get_tree(6,1);
Imprime:

Código PHP:
SnippetArchive 
Seguiré investigando dónde estaré pifiándola.
  #9 (permalink)  
Antiguo 27/08/2013, 00:19
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Arrays sin guión al principio

Cita:
Iniciado por mikehove Ver Mensaje
Gracias por escribirme amigos y enseñarme.
Estuve leyendo la documentación y disculpen todavía no encuentro el éxito que deseo.

Este es el resultado obtenido:
te comento el código indicándote los errores

Cita:
Código PHP:
Ver original
  1. function get_tree($id, $level = 0)
  2. {
  3.     $result = mysql_query('SELECT id, label FROM menu WHERE parent='.$id);
  4.     $guion = array();
  5.     while ($row = mysql_fetch_array($result))
  6.     {
  7.          $guion[] = $row['label'];
  8.  
  9.          //¿qué motivo tienes para volver a llamar a la función dentro de la función, cual es tu idea?
  10.          //le sumas valores a $level pero arriba lo igualas a cero :S
  11.          get_tree($row['id'], $level + 1);     
  12.     }
  13.     //esta parte la estás haciendo bien. te debería imprimir valor>valor2>valor3>...
  14.     echo implode(" > ", $guion);
  15.  
  16. }
  17.  
  18. //nuevamente ¿por qué como segundo parámetro le pasas el 1 si arriba lo igualas a cero?
  19. echo get_tree(6,1);

Imprime:

Código PHP:
Ver original
  1. SnippetArchive

Seguiré investigando dónde estaré pifiándola.
__________________
Ayúdame a hacerlo por mi mismo.
  #10 (permalink)  
Antiguo 27/08/2013, 10:11
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: Arrays sin guión al principio

Estás usando una función recursiva, por lo que tu arreglo "$guion" solo contiene un elemento cada llamada por lo que implode no agrega el separador. Y estás usando $level sin sentido, ya que sólo la usas para pasar como parámetro.

Si sólo vas a tener una rama del árbol a la vez, y la rama no tiene más de una rama en cada nivel,creo que podría quedar así;


Código PHP:
Ver original
  1. function get_tree($id,$level=0){
  2.     $result = mysql_query('SELECT id, label FROM menu WHERE parent='.$id);
  3.     while ($row = mysql_fetch_array($result)){
  4.           if($level)//si estamos en el segundo nivel o más
  5.                echo '>';
  6.           echo $row['label'];        
  7.           get_tree($row['id'],$level+1);       
  8.     }
  9. }
  10.  
  11. get_tree(6,1);


El problema viene si las ramas no son completamente lineales y / o si se trata de más de una rama.
  #11 (permalink)  
Antiguo 28/08/2013, 00:20
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Arrays sin guión al principio

Buenas ocp001a. Gracias por el aporte (y a mis compañeros)!.

Te comento que funciona!, solo llamé a la función con el argumento: $level=0.

Quedando tu código, con la siguiente línea:

Código:
get_tree(6,0);
Imprime:

Archive>Snippet

Muchísimas gracias!!!!

P/d: Continuaré investigando este Universo!
  #12 (permalink)  
Antiguo 05/09/2014, 20:16
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Inconveniente con guión en función recursiva

Hola amigos!. Espero que estén bien. Reabro el tema después de mucho tiempo porque me encontré con un problema parecido con otra función recursiva y no se cómo corregir la flecha o el guión que no salga al principio.
Probé con implode() y no tuve éxito.

Este es el código:

Código:
function get_path($id)
{
	$result = mysql_query('SELECT name, parent_id FROM categorias WHERE id='.$id);
	$row = mysql_fetch_array($result);	
	if ($row['parent_id'] != NULL)
	{		
		get_path($row['parent_id']);		
		echo ' > ';
		echo $row['name'];		
	}	
}
	
get_path(9);

Resultado:
> Inicio > Portasahumerios
Objetivo es que quede así:

Código:
Inicio > Portasahumerios
Ayuda por favor, chicos!

Última edición por mikehove; 05/09/2014 a las 21:51
  #13 (permalink)  
Antiguo 05/09/2014, 22:30
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Arrays sin guión al principio

Es exactamente lo mismo que el anterior, solo tienes que adaptar con las nuevas variables y listo.
__________________
- León, Guanajuato
- GV-Foto
  #14 (permalink)  
Antiguo 06/09/2014, 00:05
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Arrays sin guión al principio

Disculpame Triby, pero no es el mismo procedimiento para mí porque no tiene "while", tampoco el parámetro "level", lo intenté de muchas formas.
¿Me puedes decir por favor dónde crees que está el error?
  #15 (permalink)  
Antiguo 06/09/2014, 07:16
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Arrays sin guión al principio

Cita:
Iniciado por mikehove Ver Mensaje
Disculpame Triby, pero no es el mismo procedimiento para mí porque no tiene "while", tampoco el parámetro "level", lo intenté de muchas formas.
¿Me puedes decir por favor dónde crees que está el error?
De hecho, la recursividad en si misma es una forma de un "loop".

La idea, es que la función devuelva un array, que irás concatenando indefinidamente.

Al final, usarás dicho array para aplicarle un join().

Código PHP:
Ver original
  1. function re($id) {
  2.   $out = array();
  3.  
  4.   if ($row->parent) {
  5.     $out = re($row->parent);
  6.   }
  7.  
  8.   $out []= $row->name;
  9.  
  10.   return $out;
  11. }
  12.  
  13. var_dump(re(10));
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #16 (permalink)  
Antiguo 06/09/2014, 19:54
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Arrays sin guión al principio

Hola pateketrueke.
¿De esta forma eliminaré la flecha que sale al principio del resultado? Porque no le encuentro sentido tu código, disculpa.

Mi código completo

Cita:
function get_path($id)
{
$result = mysql_query('SELECT name, parent_id FROM categorias WHERE id='.$id);
$row = mysql_fetch_array($result);
if ($row['parent_id'] != NULL)
{
get_path($row['parent_id']);
echo ' > ';
echo $row['name'];
}
}

get_path(9);

Resultado:
> Inicio > Portasahumerios
Objetivo: Eliminar la primera flecha, como muestra el resultado del código anterior.
Que quede de esta forma:

Cita:
Inicio > Portasahumerio
Maldito guión que no puedo eliminar... Por favor

Última edición por mikehove; 07/09/2014 a las 17:45
  #17 (permalink)  
Antiguo 07/09/2014, 23:10
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Arrays sin guión al principio

Pido ayuda amigos, la verdad que desconozco, probé de muchas maneras,
¿cómo podré seguir?
ES SOLO SACAR LA FLECHA DEL PRINCIPIO DEL RESULTADO:

Esto no:
> Inicio > Portasahumerios

Esto si:
Inicio > Portasahumerios

Código completo:
Cita:
function get_path($id)
{
$result = mysql_query('SELECT name, parent_id FROM categorias WHERE id='.$id);
$row = mysql_fetch_array($result);
if ($row['parent_id'] != NULL)
{
get_path($row['parent_id']);
echo ' > ';
echo $row['name'];
}
}

get_path(9);

Última edición por mikehove; 07/09/2014 a las 23:19
  #18 (permalink)  
Antiguo 08/09/2014, 10:23
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: Arrays sin guión al principio

Podrías meter todo en un arreglo y al final unir con implode.

Código PHP:
Ver original
  1. function get_path($id){
  2.    $result = mysql_query('SELECT name, parent_id FROM categorias WHERE id='.$id);
  3.    $row = mysql_fetch_array($result);
  4.    if ($row['parent_id'] != NULL){
  5.        $ret[]=get_path($row['parent_id']);
  6.        //echo ' > ';
  7.        //echo $row['name'];
  8.       $ret[]=$row['name'];
  9.    }
  10.    return $ret;
  11. }
  12.  
  13. $res=get_path(9);
  14.  
  15. echo implode(' > ',$res);
  #19 (permalink)  
Antiguo 08/09/2014, 11:39
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Arrays sin guión al principio

Hola ocp001a. Gracias por responder. Esto es increíble. Había tratado antes de tu código incluirlo en un array y acomodarlo con implode y fue un fracaso.

Estos son los errores que me salen con tu código:

Código:
Notice: Undefined variable: ret 

Notice: Array to string conversion in C:... Array > Portasahumerios
Le había agregado también antes del if $ret = array(); y tampoco funciona.

La idea en el resultado es:

Inicio > Portasahumerios
  #20 (permalink)  
Antiguo 08/09/2014, 12:09
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: Arrays sin guión al principio

Si te da error al regresar $ret es que no existe por que no entró al if, en tal caso, se puede crear antes

Código PHP:
Ver original
  1. $ret=array();
  2.    if ($row['parent_id'] != NULL){
  3. .
  4. .
  5. .
  #21 (permalink)  
Antiguo 08/09/2014, 13:11
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Arrays sin guión al principio

Este es el aviso en pantalla:

Código:
Notice: Array to string conversion in C:..... line 23

Array > Portasahumerios
Línea 23:

Código:
echo implode(' > ',$res);
Este es el código completo:

Código:
function get_path($id){
   $result = mysql_query('SELECT name, parent_id FROM categorias WHERE id='.$id);
   $row = mysql_fetch_array($result);
   $ret=array();
   if ($row['parent_id'] != NULL){
       $ret[]=get_path($row['parent_id']);
       //echo ' > ';
       //echo $row['name'];
      $ret[]=$row['name'];
   }
   return $ret;
}
 
$res=get_path(9);
 
echo implode(' > ',$res);
  #22 (permalink)  
Antiguo 08/09/2014, 14:57
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Arrays sin guión al principio

Se soluciona fácilmente con una variable estática:

Código PHP:
Ver original
  1. function get_path($id) {
  2.    static $separa = '';
  3.    // Aquí tu consulta
  4.    if ($row['parent_id'] != NULL){
  5.        get_path($row['parent_id']);
  6.        echo $separa; // La primera vez no mostrará nada
  7.        echo $row['name'];
  8.        $separa = ' > '; // A partir de la segunda mostrará mayor-que
  9.    }
  10.  
  11. }

Aunque no entiendo porque con implode no funciona, habría que hacer un var_dump($res); para ver el contenido, seguramente hay un elemento vacío.
__________________
- León, Guanajuato
- GV-Foto
  #23 (permalink)  
Antiguo 08/09/2014, 15:51
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Arrays sin guión al principio

Tribyyy GRACIASS! Y a todos los compañeros, muuchas gracias por la bendita ayuda psicológicamente!

TU CÓDIGO FUNCIONA!!

El tema con el código anterior al tuyo no se por qué no funcionaba, hice la prueba con var_dump($res) y este es el resultado:

Código:
array(2) { [0]=> array(2) { [0]=> array(0) { } [1]=> string(6) "Inicio" } [1]=> string(15) "Portasahumerios" }
Código completo del caso anterior al tuyo:

Cita:
function get_path($id){
$result = mysql_query('SELECT name, parent_id FROM categorias WHERE id='.$id);
$row = mysql_fetch_array($result);
$ret=array();
if ($row['parent_id'] != NULL){
$ret[]=get_path($row['parent_id']);
//echo ' > ';
//echo $row['name'];
$ret[]=$row['name'];
}
return $ret;
}

$res=get_path(2);
var_dump($res);
echo implode(' > ',$res);
  #24 (permalink)  
Antiguo 08/09/2014, 15:58
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Arrays sin guión al principio

El problema de la solución de Triby es que una segunda llamada a dicha función ya habrá seteado el valor de $separa y bueno, ya entenderán.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #25 (permalink)  
Antiguo 08/09/2014, 17:00
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Arrays sin guión al principio

Hola pateketrueke. Tienes razón, cuando llamó otras veces vuelve la flecha al principio.

Triby y Pateketrueke, ¿cómo se puede corregir? Por favor

Código completo:
Cita:
function get_path($id){
static $separa = '';
$result = mysql_query('SELECT name, parent_id FROM categorias WHERE id='.$id);
$row = mysql_fetch_array($result);

if ($row['parent_id'] != NULL){
get_path($row['parent_id']);
echo $separa; // La primera vez no mostrará nada
echo $row['name'];
$separa = ' > '; // A partir de la segunda mostrará mayor-que

}

}
Repito la llamada:

Cita:
<?php
get_path(2);
?>

</br>
<?php
get_path(2);
?>
Imprime:

Cita:
Inicio > Portasahumerios
> Inicio > Portasahumerios

Última edición por mikehove; 08/09/2014 a las 17:18
  #26 (permalink)  
Antiguo 08/09/2014, 17:32
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Arrays sin guión al principio

Como ves, lo más fácil no siempre es lo adecuado.

Respecto a lo que obtienes del var_dump()... no entiendo porque el primer elemento es un array con dos elementos y uno de ellos está vacío.

Código:
array(2) {
    [0]=> array(2) {
        [0]=> array(0) { }
        [1]=> string(6) "Inicio"
    }
    [1]=> string(15) "Portasahumerios" }
Tal vez solo falta un if para evitar agregar algo si $row['name'] es una cadena vacía; de cualqueir forma, la lógica sigue siendo incorrecta, porque supongo que tendrás una telaraña si vas a niveles mas extensos.

Esto muy aparte de que no es recomendable tener consultas así en funciones recursivas; puede ser útil cuando tienes pocos visitantes, pero se convertirá en un verdadero dolor de cabeza cuando las peticiones se incrementen.

Tal vez te serviría leer esto: http://www.forosdelweb.com/f18/lista...2/#post3181868
__________________
- León, Guanajuato
- GV-Foto
  #27 (permalink)  
Antiguo 08/09/2014, 17:36
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Arrays sin guión al principio

Perfecto Triby. Ahora lo leo.
  #28 (permalink)  
Antiguo 08/09/2014, 17:45
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Arrays sin guión al principio

La estrategia que había sugerido desde un inicio debería bastar, sin embargo no era código copy+paste para que lo usaras sin restricción.

A) La idea era exponer el concepto de usar arrays para ir acumulando los valores, internamente ir concatenando dichos arrays y de manera externa hacerles join() para unirlos.

B) Ahora, también se puede hacer con una variable auxiliar (a modo de emular el comportamiento de la variable estática) pero ello también podría acarrear otros problemas.

¿Y si en lugar de imprimir la cadena deseo almacenarla?

¿Y si quiero cambiar el separador?

La solución (A) sería la correcta entonces, mientras la solución (B) es siempre más frágil (aunque posible).

A)
Código PHP:
Ver original
  1. function get_path($id) {
  2.   // $result y $row ...
  3.  
  4.   if ($row['parent_id'] != NULL) {
  5.     // existe un parent_id, inicializamos el acumulador
  6.     $salida = get_path($row['parent_id'], $separador, true);
  7.   } else {
  8.     // inicializamos el acumulador vacio
  9.     $salida = array();
  10.   }
  11.  
  12.   // agregamos el valor al acumulador
  13.   $salida []= $row['name'];
  14.  
  15.   // devolvemos el acumulador
  16.   return $salida;
  17. }
  18.  
  19. echo join('>', get_path(1));

B)
Código PHP:
Ver original
  1. function get_path($id, $separador = '>', $mostrar_separador = false) {
  2.   // $result y $row ...
  3.  
  4.   if ($row['parent_id'] != NULL) {
  5.     // existe un parent_id, mostramos separador
  6.     get_path($row['parent_id'], $separador, true);
  7.   }
  8.  
  9.   echo $row['name'];
  10.  
  11.   if ($mostrar_separador) {
  12.     echo $separador;
  13.   }
  14. }
  15.  
  16. echo get_path(1);

A propósito de lo siguiente:
Cita:
array(2) {
[0]=> array(2) {
[0]=> array(0) { }
[1]=> string(6) "Inicio"
}
[1]=> string(15) "Portasahumerios" }
Eso se debe a que se agrega el resultado de get_path() y es un array, por eso se está generando un array de arrays independientemente de si hay o no un valor.

Lo correcto sería "aplanar" el array, o en el caso de la estrategia (A) reemplazar el array por el acumulador que resuelve el parent_id.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #29 (permalink)  
Antiguo 08/09/2014, 17:57
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Arrays sin guión al principio

Recordaba que había sugerido una solución más cercana a lo que necesitas, pero no encontraba el mensaje, está aquí: http://www.forosdelweb.com/f18/aport...3/#post4284145

Sugerencia: Haz un var_dump() para ver el contenido del array y puedas adaptarlo a tus necesidades.
__________________
- León, Guanajuato
- GV-Foto
  #30 (permalink)  
Antiguo 08/09/2014, 20:37
 
Fecha de Ingreso: abril-2012
Ubicación: Argentina
Mensajes: 215
Antigüedad: 12 años
Puntos: 2
Respuesta: Arrays sin guión al principio

¿pateketrueke a qué te refieres con la variable $separador de la estrategia A?
El $separador es "= '>'"- línea 8???

Código PHP:
Ver original
  1. function get_path($id) {
  2.   // $result y $row
  3.   $result = mysql_query('SELECT name, parent_id FROM categorias WHERE id='.$id);
  4.   $row = mysql_fetch_array($result);
  5.  
  6.   if ($row['parent_id'] != NULL) {
  7.     // existe un parent_id, inicializamos el acumulador
  8.     $salida = get_path($row['parent_id'], $separador = '>', true);
  9.   } else {
  10.     // inicializamos el acumulador vacio
  11.     $salida = array();
  12.   }
  13.  
  14.   // agregamos el valor al acumulador
  15.   $salida []= $row['name'];
  16.  
  17.   // devolvemos el acumulador
  18.   return $salida;
  19. }
  20.  
  21. echo implode('>', get_path(2));

Imprime:
Código HTML:
Ver original
  1. >Inicio>Portasahumerios
En cuanto a Triby también voy a evaluar los enlaces que me pasaste

Última edición por mikehove; 09/09/2014 a las 17:25

Etiquetas: Ninguno
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:18.