Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] GEnerar un array desde otro

Estas en el tema de GEnerar un array desde otro en el foro de PHP en Foros del Web. Hola: Tengo un problema que me rompe la cabeza, tengo este array: Código PHP: $arr  = array(); $arr [ 0 ][ 'id' ] =  1 ; $arr ...
  #1 (permalink)  
Antiguo 27/04/2013, 10:52
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 3 meses
Puntos: 12
GEnerar un array desde otro

Hola:

Tengo un problema que me rompe la cabeza, tengo este array:
Código PHP:
$arr = array();
$arr[0]['id'] = 1;
$arr[0]['menu'] = 'Menu';
$arr[1]['id'] = 1;
$arr[1]['menu'] = 'Menu';
$arr[1]['__children'][0]['id']=5;
$arr[1]['__children'][0]['menu']='Navigation';
$arr[1]['__children'][1]['id']=6;
$arr[1]['__children'][1]['menumenu']='search';
$arr[2]['id'] = 9;
$arr[2]['menu'] = 'Registro'
y debo generar este otro array
Código PHP:
<?php
$ar 
= array();
$ar[0]['id'] = 1;
$ar[0]['label'] = 'Menu';
$ar[1]['id'] = 2;
$ar[1]['label'] = 'Zend';
$ar[1]['pages'][0]['id']=5;
$ar[1]['pages'][0]['label']='Navigation';
$ar[1]['pages'][1]['id']=6;
$ar[1]['pages'][1]['label']='search';
$ar[2]['id'] = 9;
$ar[2]['label'] = 'Registro';
obviamente debo usar un metodo recursivo, un ejemplo simple sería:
Código PHP:
rec($arr,'&nbsp;');

function 
rec($arr,$s){
    foreach (
$arr as $k => $v) {
        if(!
is_array($v)){
            echo 
$s.$k.' => '.$v.'<br>';
        }else
            
rec($v,$s.$s);
    }

Esto muestra el array completo, pero considerando que mi array original puede tener un "n" niveles de hijos, como haría para generar el array() hijo?
  #2 (permalink)  
Antiguo 27/04/2013, 12:20
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: GEnerar un array desde otro

Según entiendo sólo debes ir copiando los valores, pues las claves 'menu' pasa a ser 'label' y '__children' a 'pages', ¿o me equivoco?

El primero arreglo es poco consistente con eso, ¿por qué hay 'menumenu' a veces?

Para generar los sub-arrays simplemente debes usar recursividad, que ya lo haces, así que no entiendo cual es la dificultad, es un ejercicio bastante sencillo.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 29/04/2013, 07:28
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 3 meses
Puntos: 12
Respuesta: GEnerar un array desde otro

Yo tambien pienso que es un ejercicio muy censillo, sin embargo mi problema persiste en:
Código PHP:
Ver original
  1. $array = array();
  2. rec($arr,$array);
  3. function rec($arr,$array){
  4.     foreach ($arr as $k => $v) {
  5.         if(!is_array($v)){
  6.             $array[] = $v; //esta variable siempre será pisado
  7.             echo $k.' => '.$v.'<br>';
  8.         }else if(is_array($v) && !empty($v))
  9.             $array[] = array(); //aqui defino otra sub array hijo, pero no puedo llevarlo en la recursividad
  10.             rec($v, $array[]);
  11.     }
  12. }
si vemos, el problema está en que no puedo llevar en la recursividad al subaray hijo, por que siempre será pisado al momento de asignarle el valor.

Última edición por wilmer30; 29/04/2013 a las 07:40
  #4 (permalink)  
Antiguo 29/04/2013, 09:17
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: GEnerar un array desde otro

Para empezar el segundo argumento de tu función no tiene ningún uso real, así que no afecta en nada a la recursividad.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 29/04/2013, 10:16
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 3 meses
Puntos: 12
Respuesta: GEnerar un array desde otro

haber como lo explico:

en el primer bucle, mi nuevo array debería recoger asi:
$array[0]['id'] = $arr[0]['id'];
$array[0]['label'] = $arr[0]['menu'];

Ahora, en el segundo bucle si existe un hijo debería recoger asi:
$array[0]['pages'][0]['id'] = $arr[0]['__children'][0]['id']
$array[0]['pages'][0]['label'] = $arr[0]['__children'][0]['menu'];

Ahora este tiene 2 niveles pero obviamente la recursividad me devería generar para cuantos niveles sea. Considerando que el nivel 2 tiene otro nivel hijo.

$array[0]['pages'][0]['pages'][0]['id'] = $arr[0]['__children'][0]['__children']['id'];
$array[0]['pages'][0]['pages'][0]['label'] = $arr[0]['__children'][0]['__children']['menu'];

es como si en la recursividad requeriria concatenar:
1er bucle
$arra[0][x];
2do bucle:
$arra[0][x].$array[0][x];
3er bucle
$arra[0][x].$array[0][x].$array[0][x];

hasta que el hijo ya no tenga otros hijos.

La verdad no se como explicarlo mejor.
  #6 (permalink)  
Antiguo 29/04/2013, 10:26
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: GEnerar un array desde otro

Entiendo perfectamente lo que buscas, así como entiendo igual de recursividad, lo que tu no entiendes es que tu función en realidad no está creando ni afectando ningún array fuera de su definición.

Es decir, si quieres ver afectado el array original o bien, devuelves el nuevo arreglo generado para que recursivamente te genere la nueva estructura o bien, pasas por referencia el segundo argumento para que se vaya alterando.

Tu función recursiva no está mal, lo único que te falta es afectar y crear el array de salida, eso es todo.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 29/04/2013, 10:56
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 3 meses
Puntos: 12
Respuesta: GEnerar un array desde otro

pues ese es mi problema como afectar y crear el array de salida???
  #8 (permalink)  
Antiguo 29/04/2013, 11:21
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: GEnerar un array desde otro

Fácil, como te he dicho tienes dos opciones: por valor de retorno o por referencia.


Retorno:
Código PHP:
function re($input) {
  
$output = array();

  foreach (
$input as $key => $value) {
    if (! 
is_array($value)) {
      
$output[$key] = $value;
    } else {
      
$output[$key] = re($value);
    }
  }

  return 
$output;
}

$new re($old); 
Referencia:
Código PHP:
function re(&$input) {
  foreach (
$input as $key => $value) {
    if (! 
is_array($value)) {
      
$input[$key] = $value;
    } else {
      
re($value);
    }
  }
}

re($old); 
Para tu caso es mejor por retorno pues estás reescribiendo datos de una forma en otra, la referencia es un poco mas complicada de lidiar pues debes borrar valores previos, etc.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 29/04/2013, 12:04
 
Fecha de Ingreso: enero-2010
Mensajes: 491
Antigüedad: 14 años, 3 meses
Puntos: 12
Respuesta: GEnerar un array desde otro

WAO, si funciona, ni siquiera se me habia pasado por la mente el pasar el valor por retorno, si se me ideaba por referencia, en fin, dejo algúnos arreglos para los que tienen el mismo problema que yo.
Código PHP:
Ver original
  1. public function re($input) {
  2.         $output = array();
  3.         $aux = array('id'=>'id','menu'=>'label','lft'=>'lft','rgt'=>'rgt','lvl'=>'lvl','root'=>'root','controller'=>'controller','action'=>'action','class'=>'class','active'=>'active','visible'=>'visible','estado'=>'estado','fecha'=>'fecha','icono'=>'icono','orden'=>'orden','__children'=>'pages');
  4.         foreach ($input as $key => $value) {
  5.             if (! is_array($value)) {
  6.                 $output[$aux[$key]] = $value;
  7.             } else if($key === '__children' ){
  8.                 $output['pages'] = $this->re($value);
  9.             }else
  10.                 $output[$key] = $this->re($value);             
  11.         }
  12.         return $output;
  13.     }  
  14. print_r($this->re($arrayTree));
la impresion final es el array que yo buscaba.
Los creditos son de pateketrueke, MUCHAS GRACIAS.

Etiquetas: 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 00:41.