viernes, 30 de enero de 2009

Manual de PHP 36. Extraer información: Posicionamiento y Ordenación en Arrays

Localización de valores en una matriz

in_array(valor,array)

La función in_array busca en la matriz (array) el valor (numérico o cadena) contenido en el parámetro valor. Si lo encuentra devuelve 1, y, si no existiera devolvería NUL.

Posicionamientos en una matriz

Mediante estas funciones se puede modificar la posición del puntero interno de una matriz y determinar los índices de los elementos a los que apunta en cada momento.

key(array)

Devuelve el índice del elemento de la matriz al que apunta en ese momento el puntero interno de la matriz.

¡Cuidado!

Fíjate en el ejemplo. Pese a que hemos pedido a PHP que nos muestre, mediante la instrucción echo $a[3], esa lectura no mueve el puntero interno, que sigue señalando a la primera posición (devuelve CERO).

reset(array)

Desplaza el puntero interno a la posición del primer índice del array.

end(array)

Desplaza el puntero interno a la posición del último índice del array.

pos(array)

Mantiene el puntero interno en la posición del actual.

next(array)

Avanza el puntero interno en una posición respecto a la actual.

prev(array)

Retrocede el puntero interno en una posición respecto a la actual.



Moviendo el puntero interno



<?
$a=array(1,2,3,1,1,2,3,3,4,4,4,0,1);
$b=array("blanco","azul","blanco","blanco","azul","Blanco","Azul");
$c=array(
"a"=>"rojo",
"b" =>"verde",
"c" =>"rojo",
"d" =>"rojo",
"e" =>"verde",
"f" =>"Rojo",
"g" =>"Verde")
;

echo "<h3>Busca un valor en una matriz</h3>";

echo " Busca el valor en la matriz: <b>#",in_array(3,$a),
"#</b> Si no ha puesto nada no estaba, si 1 lo encontró <BR>";
echo " Busca el valor en la matriz: <b>#",in_array(7,$a),
"#</b> Si no ha puesto nada no estaba, si 1 lo encontró <BR>";
echo " Busca el valor en la matriz: <b>#",in_array("gris",$b),
"#</b> Si no ha puesto nada no estaba, si 1 lo encontró <BR>";
echo " Busca el valor en la matriz: <b>#",in_array("blanco",$b),
"#</b> Si no ha puesto nada no estaba, si 1 lo encontró <BR><br>";

echo "<h3>Posicionandose y determinando indices actuales</h3>";

echo "Este el valor asoaciado al indice 3 de la matriz a: ",$a[3],"<br>";
echo "El puntero interno apunta a la clave: ",key($a),"<br>";
echo "Este es el valor siguiente al anterior: ",next($a),"<br>";
echo "El puntero interno apunta a la clave: ",key($a),"<br>";
echo "Este es el primer valor de la matriz a: ",reset($a),"<br>";
echo "El puntero interno apunta a la clave: ",key($a),"<br>";
echo "Este es el ultimo valor de la matriz a: ",end($a),"<br>";
echo "El puntero interno apunta a la clave: ",key($a),"<br>";
echo "Este es el penúltimo valor de la matriz a: ",prev($a),"<br>";
echo "El puntero interno apunta a la clave: ",key($a),"<br>";
echo "Este es el mismo valor anterior: ",pos($a),"<br>";
echo "El puntero interno apunta a la clave: ",key($a),"<br>";

echo "Este el valor asoaciado al indice 4 de la matriz b: ",$b[4],"<br>";
echo "El puntero interno apunta a la clave: ",key($b),"<br>";
echo "Este es el valor siguiente al anterior: ",next($b),"<br>";
echo "El puntero interno apunta a la clave: ",key($b),"<br>";
echo "Este es el primer valor de la matriz a: ",reset($b),"<br>";
echo "El puntero interno apunta a la clave: ",key($b),"<br>";
echo "Este es el ultimo valor de la matriz a: ",end($b),"<br>";
echo "El puntero interno apunta a la clave: ",key($b),"<br>";
echo "Este es el penúltimo valor de la matriz a: ",prev($b),"<br>";
echo "El puntero interno apunta a la clave: ",key($b),"<br>";
echo "Este es el mismo valor anterior: ",pos($b),"<br>";
echo "El puntero interno apunta a la clave: ",key($b),"<br>";

?>


Ordenaciones de arrays

Los elementos de un array se van ordenando según se van definiendo. Por tanto, su orden no es el mismo que el de los valores de sus índices.

Las funciones PHP que ordenan los elementos de un array permiten dos opciones.

Con una de ellas es posible la ordenación de los elementos sin modificar los valores de los índices, mientras que la otra sí modifica los índices.

En el segundo de los casos la modificación puede afectar incluso al tipo de índices dado que los resultados de las ordenaciones –tanto si hemos partido de un array escalar como si lo hemos hecho desde uno asociativo– es siempre un array escalar.

Ordenación por valores sin mantener índices

sort(array)

Ordena los valores del array en sentido creciente y lo reindexa asignando índice CERO al menor de los valores.

rsort(array)

Ordena la matriz en sentido decreciente de sus valores y la reindexa asignando índice CERO al mayor de estos.

Ordenación por índices

ksort(array)

Ordena la matriz según sus índices y en sentido creciente de estos.

krsort(array)

Ordena la matriz por índices en sentido decreciente de los mismos.

Ordenación por valores manteniendo índices

asort(array)

Ordena la matriz según sus valores en sentido creciente y mantiene los índices del array original.

arsort(array)

Ordena la matriz por valores en sentido decreciente y sigue manteniendo los índices originales.

Ordenación mediante función definida por usuario

PHP permite que el usuario pueda defina funciones en las que establezca sus criterios particulares de ordenación. Las funciones PHP que permiten usar esta característica son las siguientes:

uasort(array, funcion)

Ordena la matriz utilizando los criterios establecidos por la función definida por el usuario y mantiene los índices del array.

usort(array, funcion)

Ordena la matriz por valores utilizando los criterios definidos en la función de usuario y modifica los índices.

uksort(array, funcion)

Ordena la matriz por claves utilizando los criterios definidos en la función.

En el ejemplo hemos definido una función de comparación siguiendo el criterio de ser o no ser múltiplo de 2.

Trataremos las funciones en un tema aparte. La utilidad de la que hemos incluido en el ejemplo es la siguiente: Si el valor de la variable es par le asignamos un número negativo como respuesta y en caso contrario uno positivo.

De esta forma los valores del array que devuelven negativos se consideran anteriores en la ordenación a los que dan como resultado un número positivo.


Ordenaciones de arrays



<?
$a=array(1,2,3,1,1,2,3,3,4,4,4,0,1);
$b=array("blanco","azul","blanco","blanco","azul","Blanco","Azul");
$c=array(
"b" =>"verde",
"c" =>"rojo",
"e" =>"verde",
"f" =>"Rojo",
"g" =>"Verde",
"a"=>"rojo",
"d" =>"rojo",)
;

sort ($a);

echo "<h3>Ordenación por valores usando sort</h3>";
foreach ($a as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor, "<br>";
}

sort ($c);

echo "<h3>Ordenación por valores usando sort</h3>";
foreach ($c as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor, "<br>";
}

rsort($a);

echo "<h3>Ordenación inversa por valores usando rsort</h3>";
foreach ($a as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor, "<br>";
}

ksort($b);

echo "<h3>Ordenación por claves usando ksort</h3>";
foreach ($b as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor, "<br>";

}

krsort($b);

echo "<h3>Ordenación inversa por claves usando krsort</h3>";
foreach ($b as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor, "<br>";

}

asort($c);

echo "<h3>Ordenación por valores manteniendo indices </h3>";
foreach ($c as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor, "<br>";

}

arsort($c);

echo "<h3>Ordenación inversa por valores manteniendo indices arsort</h3>";
foreach ($c as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor, "<br>";

}
echo "<h3>Ordenación por valores mediante
función de usuario manteniendo indices</h3>";


/* esta funcion recoge el valor de la variable $a
y aplicar el operador de comparación ternario
de forma que si el valor de la variable es impar
devuelve como valor -2 y si es par devuelve 2
el 2 y el menos 2 unicamente establecen criterios de
comparacion de modo que los valores -2 serán considerados
anteriores a los valores +2 */


function micomparar (&$a) {
return ($a%2!=0) ? -2 : 2;
}


uasort ($a, micomparar);

foreach ($a as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor, "<br>";

}
echo "<h3>Ordenación por clave mediante función de usuario </h3>";

uksort ($a, micomparar);

foreach ($a as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor, "<br>";

}

echo "<h3>Ordenación por valores mediante función de usuario </h3>";

usort ($a, micomparar);

foreach ($a as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor, "<br>";

}

?>








No hay comentarios: