Recorrer array multidimensional recursivamente

Posteado por Juan Benitez | Lenguaje PHP | Tuesday 17 March 2009 12:05 am

A veces tenemos que tartar con arrays multidimensionales que son bastante complicados en su estructura, por lo que tenemos que empezar a escribir foreach’s anidados como locos, con la consecuencia inmediata de bajar la eficiencia de nuestros scripts y de disminuir la legibilidad de nuestro código.

Vamos a ver como mejorar estos inconvenientes usando una función recursiva.
Supongamos que tenemos el siguiente array:

<?php
$frases[] = array('yahoo'=> array('title'=> array('count'=>1, 'text'=>"Yahoo!!") , '__total__'=>20));		
$frases[] = array('google'=> array('title'=> array('count'=>21, 'text'=>"google!!") , '__total__'=>230));	
$frases[] = array('msn'=> array('title'=> array('count'=>25, 'text'=>"msn!!") , '__total__'=>123, 'mas'=> array('elem1','elem2')));	
$frases[] = array('elem3'); 
 
/* asi se ve la estructura del array
Array
(
    [0] => Array
        (
            [yahoo] => Array
                (
                    [title] => Array
                        (
                            [count] => 1
                            [text] => Yahoo!!
                        )
                    [__total__] => 20
                )
        )
    [1] => Array
        (
            [google] => Array
                (
                    [title] => Array
                        (
                            [count] => 21
                            [text] => google!!
                        )
                    [__total__] => 230
                )
        )
    [2] => Array
        (
            [msn] => Array
                (
                    [title] => Array
                        (
                            [count] => 25
                            [text] => msn!!
                        )
                    [__total__] => 123
                    [mas] => Array
                        (
                            [0] => elem1
                            [1] => elem2
                        )
                )
        )
    [3] => Array
        (
            [0] => elem3
        )
)
*/
?>

Como podemos ver es bastante complicado en su estructura, por lo que utilizar foreach anidados para recuperar los datos sería un dolor de cabeza; además, para diferentes estructuras deberíamos reescribir el código para recorrerla.
Veríamos algo como lo siguiente:

<?php 
foreach($frases as $frase_key => $frase_info){
 
          foreach($frase_info as $tag_key => $tag_info){
 
		foreach($tag_info as $data_key => $data_info){
 
.....
.....
?>

La clave del asunto es ver este tipo de arrays como si fueran grafos (ver teoría de grafos) y de esta manera crear una función recursiva que use algún algoritmo conocido para recuperar los valores.

Veamos la función:

<?php
 
function recorro($matriz){
 
	foreach($matriz as $key=>$value){
 
		if (is_array($value)){  
                        //si es un array sigo recorriendo
			echo 'key:'. $key;
			echo '<br>';
			recorro($value);
		}else{  
		       //si es un elemento lo muestro
			echo $key.': '.$value ;
			echo '<br>';
		}
 
	}
 
} 
?>

Esta función recorre el array completamente sin importar lo intrincado de su estructura, además, es muy eficiente y la lectura del código es muy simple, también es una solución genérica y reusable.


VN:F [1.6.3_896]
Te gusto este post?
Rating: 0.0/10 (0 votes cast)

Como usar array_multisort en PHP

Posteado por Juan Benitez | Lenguaje PHP | Wednesday 11 March 2009 2:15 am

Muchas veces nos encontramos con que necesitamos ordenar datos extraidos de una consulta SQL o que leimos desde un archivo; ahí es cuando entra en juego la función array_multisort, al principio puede ser un poco confusa pero luego que la usas varias veces se convierte en una gran utilidad.

Además, es tan poderosa casi como el ORDER BY de SQL por lo que en muchas ocasiones podemos optar por ordenar los resultados fuera de la sentencia SQL lo que supondría un aumento en la eficiencia del query.

Bueno, veamos un ejemplo que vale más que mil palabras:

<?php
$datos[] = array(0, 'perro', 'negro');
$datos[] = array(1, 'gato', 'blanco'); 
$datos[] = array(2, 'liebre', 'gris'); 
$datos[] = array(3, 'oso', 'marron'); 
 
foreach ($datos as $key => $fila) {
            $animales[$key]  = $fila[1]; // columna de animales
            $colores[$key] = $fila[2]; //columna de colores
        }
 
//ordenamos ascendente por la columna elegida
array_multisort($animales, SORT_ASC, $datos);
print_r($datos); 
?>

En el ejemplo anterior tenemos el array $datos con la información que queremos ordenar; la idea es poner las columnas que te interesan ordenar en arrays independientes de esta forma puedes ordenar por la columna que quieras o por varias a la vez.

Dentro del foreach ponemos en $animales los valores de la columna de los animales, es decir, “perro”, “gato”, “liebre” y “oso”; lo mismo hacemos con la columna de los colores.

Luego usamos la función array_multisort  y le pasamos la columna por la que queremos ordenar, si es ascendente o descendente y finalmente el array original donde se guardara el array ordenado.

Ahora tenemos el array $datos ordenado por la columna animales.

Cabe destacar que es posible ordenar por más de una columna a la vez y por diferentes criterios, lo que hace que array_multisort sea una función sumamente flexible, por eso es recomendable leer la documentación oficial para conocer todas las posibilidades que nos ofrece.

Mas información en: www.php.net/array_multisort





VN:F [1.6.3_896]
Te gusto este post?
Rating: 0.0/10 (0 votes cast)

Campos de selección múltiple en PHP

Posteado por Juan Benitez | Lenguaje PHP | Tuesday 3 February 2009 1:09 am

Vamos a ver un forma simple de trabajar con campos de selección múltiple; es decir, que se puede seleccionar más de un valor a la vez. Para que quede mas claro vamos a ver un ejemplo completo, supongamos que tenemos el siguiente formulario:

index.html

1
2
3
4
5
6
7
8
9
10
11
   <form name="prueba" action="proceso_colores.php" method="POST">
         Cuales son tus colores preferidos?
        <br>
        Rojo <input type="checkbox" name="color_rojo" value="rojo" />
        <br>
        Azul <input type="checkbox" name="color_azul" value="azul" />
        <br>
        Verde <input type="checkbox" name="color_verde" value="verde" />
        <br>
        <input type="submit" value="Enviar" name="btn_colores" />
    </form>

Lo que vemos son 3 campos tipo checkbox llamados: color_rojo, color_azul y color_verde, típicamente recuperaríamos los valores de los campos de la siguiente forma:

proceso_colores.php

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
//recupero mediante POST
$rojo = $_POST['color_rojo'];
$azul = $_POST['color_azul'];
$verde = $_POST['color_verde'];
 
echo $rojo  . '<br>';
echo $azul  . '<br>';
echo $verde . '<br>';
 
//despues trabajamos con las variables normalmente...
 
?>

Esto es bueno siempre que nuestros campos sean independientes, pero que sucede cuando queremos seleccionar multiples valores ? tendriamos que recuperar en nuestro código PHP todas las variables… y si el campo es cargado dinámicamente? o si los valores posibles son variables?… todo esto genera sin dudas trabajo extra, dado que tendríamos que retocar el código cada vez que algo cambie.
Por suerte, existe una forma sencilla de trabajar con este tipo de campos; ahora veremos que cambios debemos hacer en nuestros archivos .

index.html

1
2
3
4
5
6
7
8
9
10
11
<form name="prueba" action="proceso_colores.php" method="POST">
         Cuales son tus colores preferidos?
        <br>
        Rojo <input type="checkbox" name="colores[]" value="rojo" />
        <br>
        Azul <input type="checkbox" name="colores[]" value="azul" />
        <br>
        Verde <input type="checkbox" name="colores[]" value="verde" />
        <br>
        <input type="submit" value="Enviar" name="btn_colores" />
    </form>

Nótese que cambiamos los nombres de los checkboxes y agregamos los paréntesis rectos [], ahora todos se llaman colores[], al hacer esto el intérprete de PHP almacena todos los valores chequeados en el array colores[] lo que nos permite hacer lo siguiente:

proceso_colores.php

1
2
3
4
5
6
<?php
$colores = $_POST['colores'];
 
$texto_colores = implode(', ', $colores);
echo ' Tus colores son favoritos son: ' . $texto_colores;
?>

El código anterior recupera la variable colores (que ahora es un array y tiene cargados los valores chequeados); luego usamos la función implode para generar una cadena de texto y poder mostrarla.

Ahora que sabemos como trabajar con este tipo de campos, vamos a ver un ejemplo donde generamos una cadena para usarla en una sentencia SQL

proceso_colores.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$colores = $_POST['colores'];
 
foreach($colores as $color){
    $valor = "'".$color."'";
    $colores_aux[] = $valor;
}
$valores = implode(', ', $colores_aux);
$sql_valores = "(" .$valores. ")";
 
$sql_insert = "INSERT INTO TBL_COLORES (color) VALUES " . $sql_valores. ";";
echo $sql_insert;
 
?>

Lo que hacemos es recuperar la variable e iterar sobre el array para poner en cada valor las comillas correspondientes; luego, guardamos las cadenas nuevamente en un array auxiliar y finalmente usamos la función implode para agregar las comas. La cadena generada se concatena en la sentencia INSERT y listo.

Podemos ver que es una técnica muy util ya que nos permite manejar este tipo de campos variables de forma simple. Además, hace nuestro código mas reusable ya que ahora no tenemos que cambiar nada en el caso que se agreguen mas valores.

VN:F [1.6.3_896]
Te gusto este post?
Rating: 8.3/10 (3 votes cast)



Tecnopedia.net - 2009 / Condiciones de Uso / Contacto / RSS
Tecnopedia.net desarrollada bajo licencia Creative Commons Creative Commons License