Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO Problema para recorrer un array multidimensional y encontrar un valor

Estas en el tema de Problema para recorrer un array multidimensional y encontrar un valor en el foro de PHP en Foros del Web. Hola. Soy nuevo en el foro, y creo que me van a poder ayudar. Mi problema es mas bien teorico / practico, ya que no ...
  #1 (permalink)  
Antiguo 18/12/2014, 14:46
 
Fecha de Ingreso: enero-2013
Mensajes: 5
Antigüedad: 11 años, 3 meses
Puntos: 0
Pregunta Problema para recorrer un array multidimensional y encontrar un valor

Hola. Soy nuevo en el foro, y creo que me van a poder ayudar. Mi problema es mas bien teorico / practico, ya que no entiendo que es lo esta fallando. Tengo un metodo de mi clase Test que se encarga de recibir, en este caso, un array multidimensional de longitud indefinida y su funcion es encontrar valores dentro de dicho array.

Lo que querria lograr es que pasando los argumentos $array y $key me devuelva el $value de dicho $key, independientemente de que el valor devuelto sea un Array o un string.

Les paso el codigo para ver si alguien puede señalarme el error. Desde ya, muchisimas gracias. Saludos para todos.

Código PHP:
$array['database']['db_host'] = '127.0.0.1';
$array['database']['db_user'] = 'root';
$array['database']['db_pass'] = ''    ;
$array['fonts'] = 'arial, helvetica, sans-serif';
$array['colors']['red'] = '#ff0000';
$array['colors']['blue'] = '#0000ff';
$array['colors']['greens']['green']['cosas_verdes'] = array('manzanas verdes','peras?');
$array['colors']['greens']['lime'] = '#00ff00';
$array['colors']['greens']['teal'] = '#008080';

class 
test
{
    
    function 
buscar2($matriz$busqueda)
    { 
        foreach(
$matriz as $key=>$value)
        {     
            if (
is_array($value))
            {  
                if(!
is_numeric($key) && $key === $busqueda)
                { 
                    return 
$matriz[$key]; 
                } 

                
$this->buscar2($value,$busqueda);
            }
            else
            {  
                if(!
is_numeric($key) && $key == $busqueda)
                { 
                    
//echo "$value";
                    
return $value;
                }
            }     
        }    
    }
}
echo 
"<pre>";
$c = new test();
var_dump($c->buscar2($array,'db_host'));    //da NULL . Si en la funcion comento el return y hago echo imprime el valor. Sino no
var_dump($c->buscar2($array,'database'));     //devuelve el array    
var_dump($c->buscar2($array,'colors'));     //devuelve el array
var_dump($c->buscar2($array,'red'));     //da NULL .
var_dump($c->buscar2($array,'cosas_verdes'));     //da NULL . 
var_dump($c->buscar2($array,'greens')); //da NULL . 

Última edición por santiagokian; 18/12/2014 a las 14:55
  #2 (permalink)  
Antiguo 18/12/2014, 16:24
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema para recorrer un array multidimensional y encontrar un valor

La invocación recursiva también devuelve un valor pero no haces uso de él.

Es clave para la recursividad mantener el mismo comportamiento que has definido.

Además si sólo buscas valores que sean arrays o strings no necesitas un if-then-else, sólo una comparación con OR:
Código PHP:
Ver original
  1. if ((is_array($value) || is_string($value)) && ($key === $busqueda)) {
  2.   // OK
  3. }
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 19/12/2014, 11:48
 
Fecha de Ingreso: enero-2013
Mensajes: 5
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Problema para recorrer un array multidimensional y encontrar un valor

Estimado : muchisimas gracias por su respuesta. Modifique la funcion (copio debajo) pero estoy cometiendo algun tipo de error que impide que la misma funcione como quisiera ( que al encontrar el needle en el bucle foreach me devuelva su value, independientemente de que sea un array o string el mismo). Codigo :
Código PHP:
<?php
$array
= array(array(41,186,384),321,93,array(254,325,array(195,402)),299);
$array['database']['db_host'] = '127.0.0.1';
$array['database']['db_user'] = 'root';
$array['database']['db_pass'] = ''    ;
$array['fonts'] = 'arial, helvetica, sans-serif';
$array['colors']['red'] = '#ff0000';
$array['colors']['blue'] = '#0000ff';
$array['colors']['greens']['green']['cosas_verdes'] = array('manzanas verdes','peras?');
$array['colors']['greens']['lime'] = '#00ff00';
$array['colors']['greens']['teal'] = '#008080';

function 
recursive_array_search_dos($needle,$haystack )
{
    foreach(
$haystack as $key=>$value
    {
        if ((
is_array($value) || is_string($value)) && ($key === $needle))  var_dump($value); 
        
//if ((is_array($value) || is_string($value)) && ($key === $needle))  return $value;
           
else {
               if(
is_array($value)) recursive_array_search_dos($needle,$value);
       }     
    }
}
echo
"<pre>";
 
(
recursive_array_search_dos('database',$array));
(
recursive_array_search_dos('db_host',$array));
(
recursive_array_search_dos('db_user',$array));
(
recursive_array_search_dos('fonts',$array));
(
recursive_array_search_dos('blue',$array));
(
recursive_array_search_dos('greens',$array));

var_dump(recursive_array_search_dos('database',$array));
var_dump(recursive_array_search_dos('db_host',$array));
var_dump(recursive_array_search_dos('db_user',$array));
var_dump(recursive_array_search_dos('fonts',$array));
var_dump(recursive_array_search_dos('blue',$array));
var_dump(recursive_array_search_dos('greens',$array));
Si descomento la linea que esta comentada y ejecuto, lo que noto es que la funcion esta encontrando el key == needle y lo imprime. Pero a esa si le pongo un return $value ( linea siguiente ) me devuelve un valor NULL. Estaria sumamente agradecido si puede ayudarme a dilucidar que es lo que no se o estoy haciendo mal. saludos y gracias.
  #4 (permalink)  
Antiguo 19/12/2014, 11:54
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema para recorrer un array multidimensional y encontrar un valor

Observa el siguiente algoritmo:
Código PHP:
Ver original
  1. function find($list, $key) {
  2.   $found = null;
  3.  
  4.   foreach ($list as $k => $v) {
  5.     if ((is_array($v) || is_string($v)) && ($key === $k)) {
  6.       $found = $v;
  7.       break;
  8.     } else {
  9.       $re = find($v, $key);
  10.  
  11.       if ($re !== null) {
  12.         $found = $re;
  13.         break;
  14.       }
  15.     }
  16.   }
  17.  
  18.   return $found;
  19. }

La clave está en cómo determinar si se ha hallado un valor, y al ser recursivo debes tener un control del mismo sobre el loop, y no devolver el valor inmediatamente, etc.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 19/12/2014, 12:36
 
Fecha de Ingreso: enero-2013
Mensajes: 5
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Problema para recorrer un array multidimensional y encontrar un valor

Muchas Gracias por la respuesta estimado ! Saludos

Etiquetas: recursion
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 17:20.