Foros del Web » Programando para Internet » PHP »

Como recorrer todos los posibles valores y dimensiones de un array/matriz?

Estas en el tema de Como recorrer todos los posibles valores y dimensiones de un array/matriz? en el foro de PHP en Foros del Web. tengo una matriz llamada "ar" donde tengo estos indices y diferentes dimensiones de la matriz. $ar["ind1"] = "mascara 1"; $ar["ind2"] = "mascara 2"; $ar["ind1"][0] = ...
  #1 (permalink)  
Antiguo 24/01/2006, 20:56
 
Fecha de Ingreso: enero-2003
Mensajes: 122
Antigüedad: 14 años, 11 meses
Puntos: 1
Como recorrer todos los posibles valores y dimensiones de un array/matriz?

tengo una matriz llamada "ar" donde tengo estos indices y diferentes dimensiones de la matriz.

$ar["ind1"] = "mascara 1";
$ar["ind2"] = "mascara 2";

$ar["ind1"][0] = "sub mascara 0";
$ar["ind1"][1] = "sub mascara 1";
$ar["ind1"][2] = "sub mascara 2";

$ar["cualquiera"]["x"]["y"] = "x mascara y";


Como hacer para recorrer toda la matriz sin saber cuantas dimensiones tiene? para trabajar el valor de dicho indice? siempre conservando las dimensiones y nombre de indice.

osea mas o menos lo que quiero es imprimir (modificar o lo que sea) todos los valores contenidos en la matriz algo asi como lo haria print_r();

agradeceria su ayuda.
  #2 (permalink)  
Antiguo 24/01/2006, 21:17
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 12 años, 6 meses
Puntos: 2
Probaste con un foreach??? Fíjate si te sirve, si no trata de ser mas especifico y veremos que podemos hacer por ti.

Saludos.
  #3 (permalink)  
Antiguo 24/01/2006, 22:15
 
Fecha de Ingreso: enero-2003
Mensajes: 122
Antigüedad: 14 años, 11 meses
Puntos: 1
Cita:
Iniciado por DarioDario
Probaste con un foreach??? Fíjate si te sirve, si no trata de ser mas especifico y veremos que podemos hacer por ti.

Saludos.
si probe pero al no conocer las dimensiones que tendra el array no me sirviria, o si con alguna funcion.
  #4 (permalink)  
Antiguo 24/01/2006, 23:24
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 12 años, 6 meses
Puntos: 2
Y lo que tendrías que hacer es una función recursiva, creo que tengo una por ahí, mañana me fijo y te la paso si la encuentro...

Saludos.
  #5 (permalink)  
Antiguo 25/01/2006, 07:28
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 13 años, 4 meses
Puntos: 101
De rápido se me ocurrió algo como:
Código PHP:
function My_print_r($arr) { // :-D que tonteria
    
echo "$arr\n";
    if(
is_array($arr)) { 
        echo 
"{\n";
        foreach(
$arr as $key => $val) { 
            echo 
"\t[$key] => ";
            
My_print_r($val); 
        }
        echo 
"}\n";
    }

... traté de igualar el comportamiento de print_f() pero no le hayo cómo controlar los "niveles" --al imprimir-- que no sea pasando como parámetro el número de recursión... quizá no haya de otra pero es lo de menos. El caso es que sí recorre toda la matríz y solo emplea un foreach() y un is_array() --relativamente "limpia"--, quiero suponer sabrás adaptarla y/o te dará idea al menos....

Un ejemplo:
Código PHP:
<?php
$matriz
= array("1""2"=>array("2.1""2.2"=>array("2.2.2""2.2.3"), "2.3"), "3"); // lo acabo de inventar

function My_print_r($arr) { // :-D que tonteria
    
echo "$arr\n";
    if(
is_array($arr)) { // si es una matriz
        
echo "{\n";
        foreach(
$arr as $key => $val) { // Desglozas
            
echo "\t[$key] => ";
            
My_print_r($val); // recursión
        
}
        echo 
"}\n";
    }
}

// comparemosla
echo "<pre>";
echo 
"Con My_print_r()\n";
My_print_r($matriz);
echo 
"\n\nCon print_r()\n";
print_r($matriz);
echo 
"</pre>";
?>
Ojalá y encuentres la función DarioDario. Saludos!
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #6 (permalink)  
Antiguo 25/01/2006, 09:29
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 12 años, 6 meses
Puntos: 2
La opción de jam1138 ( ) es casi la misma que la mía, la idea es la misma, este tipo de funciones no tienen muchas variantes, se basan sobre lo mismo.

Al fin encontré el código, pero al verlo funcionar me dio vergüenza mostrarlo tal cual estaba (una persona normal no puede leer el resultado que este daba), entonces le puse un poco de color y un delimitador de niveles para que se note la profundidad. Lo modifique bastante a comparación de como estaba.

Aquí te lo dejo con un ejemplo, no sé si te servirá o si lo uses pero aquí lo dejo:

Código PHP:
$aray[] = array('sadas',4,56,89,'dario');
$aray['dari'] = array(array(12,546,3),array('asd',array(456,78,23,"dal"),56));
$aray['por'] = array(array(array(array(34,'dsaf'),12),23,5,578,35,'sdgsdsd'),'dar''asdasdsa' => 12);

$color = array('#000000','#93001E','#D7002B','#FF4066','#F8995A','#FACD7A','#FCDEA7','#C7FAA0');

function 
my_print_r($val,$delimitador,$nivel=0)
{
        global 
$color;

        foreach(
$val as $key => $value)
        {
                echo 
"<font color=\"".$color[$nivel]."\"><b>";

                if(
is_array($value))
                {
                        
$delim $delimitador;

                        for(
$i 0$i $nivel$i++)
                            
$delim .= $delim;

                        echo 
$delim."array [ $key ]<br>\r";

                        
my_print_r($value,$delimitador,$nivel+1);
                }else{
                        
$delim $delimitador;

                        for(
$i 0$i $nivel-1$i++)
                            
$delim .= $delim;

                        echo 
$delim." [$key] => [$value]<br>\r";
                }

                echo 
"</b></font>";
        }
}

my_print_r($aray,"-"); 
Cualquier consulta haz la que aquí estaré.

Saludos.
  #7 (permalink)  
Antiguo 25/01/2006, 21:49
 
Fecha de Ingreso: enero-2003
Mensajes: 122
Antigüedad: 14 años, 11 meses
Puntos: 1
gracias me sirvio
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 02:25.