sábado, 31 de enero de 2009

El sistema menéame

A principios de mes, Javier Sampedro escribía una columna en el país sobre menéame titulada "Una portada que no podrá rechazar" (11-1-2009). En la misma hacía un análisis bastante crítico sobre el sistema de votación en menéame que curiosamente fué llevada al portal para ser votada.

La crítica se centraba básicamente en dos puntos, por un lado que la gente no publica las noticias que cree interesantes o importantes, sino las que espera lleguen a portada, lo que cree puede gustar a los demás. Por otro, aseguraba que las noticias dependen en buena medida de los usuarios con mas Karma, o lo que es lo mismo, los que más votan positiva y negativamente noticias, que en realidad, al final, son los que deciden qué llega a portada y qué no.

Recientemente siguiendo la noticia: "Impresionante modelo en 3d de la ciudad de Orense en Google Earth" me ha pasado algo curioso. Los que hayan leído este blog alguna vez sabrán que es un tema que he tratado en un artículo anterior así que me sorprendieron un par de cuestiones: en primer lugar que, casi inmediatamente la noticia fue votada negativamente por estar repetida - como muestra enlazaba otra noticia que hacía referencia a Ourense 3D pero que no tenía nada que ver con google earth y que además era del mismo autor , pero el usuario tenía bastante karma- y por otra, que casi inmediatamente amenazaron con votarla negativamente por emplear en el título Orense en lugar de Ourense -la amenaza se cumplió por no cumplir dicha exigencia-.

Más curioso todavía es que viendo las noticias enviadas por el defensor del topónimo gallego, casi todas hacen hincapié en la peor imagen que de los gallegos tienen en el exterior ( caciquismo endémico y bajo nivel en las declaraciones de nuestros políticos) y una positiva que surge de un reconocimiento mundial a un proyecto Orensano -prefiere votarla como "errónea" antes de emplear el nombre de Orense en falso.

Por cierto la noticia la he subido yo, pero como me importa bastante poco que mi karma baje a -50 la mantendré abierta, pese al chaparrón, con su título intacto. Me pregunto, en cualquier caso, si en lugar de haberla titulado con Orense lo hubiera hecho empleando Ourense, al menos uno de los votos hubiese sido positivo en lugar de negativo será que yo no entiendo el nacionalismo de igual modo.

En fin, que si no quieres que tu karma te baje hasta los infiernos no se te ocurra colgar esta crítica en el portal, ni menear la noticia de Orense positivamente.

Manual de PHP 39. Funciones: Funciones que devuelven valores.

Funciones que devuelven valores

Las funciones PHP pueden ser llamadas a partir de un script y posteriormente recoger –en ese mismo script– los resultados de su ejecución.

Para conseguir este resultado debemos escribir dentro de la función la instrucción return seguida de la variable o la instrucción cuyo resultado queremos que sea devuelto al script desde el que ha sido llamada la función.

Tal como podemos ver en el ejemplo, los valores devueltos por return pueden ser presentados directamente en la página o recogidos por una variable.

También es posible que la función genere un array y que este sea devuelto a una variable que se convertiría a ese tipo de forma automática.

Otra opción de recoger los valores devueltos por return es invocar la función mediante una llamada del tipo:

list(v1, v2,..)=llamada

Las variables v1, v2, etc. recogerán los valores de los elementos del array devuelto por la función.


span id="titulito">Ejemplos de funciones que devuelven valores


<?
# asignamos valores a dos variables
$a=3; $b=5;
# escribimos una función que eleva la variable a
# a la potencia indicada en b
# insertando return delante de la operación
function a1($a,$b){
return pow($a,$b);
}

#incluimos en la instruccion echo una llamada
# a la función y en ella pasamos los valores
# recogidos en las variables a y b
# return conseguirá que se ejecute esa función
# y que echo recoja e imprima el resultado
echo "El valor de a elevado a b es: ",a1($a,$b),"<br>";
# esta otra función generará y devolverá un array
# con los resultados de la ejecucion del bucle for
function a2($a,$b){
for ($i=0;$i<=$b;$i++){ $z[]=pow($a,$i); }
return $z;
}

# hacemos una llamada a la función
$p=a2($a,$b);
# leemos el array devuelto desde fuera de la función
foreach($p as $clave=>$valor){
echo "El valor de a (3) elevado a: ",$clave," es: ",$valor,"<br>";
}
echo "<br>";

# otra forma de leer el array con los resultados de la funcion
list($r,$s,$t)=a2($a,$b);
echo "Este es el valor recogido en la variable r :",$r,"<br>";
echo "Este es el valor recogido en la variable s :",$s,"<br>";
echo "Este es el valor recogido en la variable t :",$t,"<br>";
?>


ejemplo69.php







Manual de PHP 38. Funciones: Funciones de usuario.

¿Qué son las funciones de usuario?

De igual forma que ocurre con el navegador en el caso del HTML, PHP lee e interpreta las instrucciones contenidas en los scripts de forma secuencial.

Es decir, las instrucciones se van ejecutando en el mismo orden en el que aparecen en el documento original, con la excepción de las funciones.

En este caso, los bloques de instrucciones son puestos a disposición de PHP, pero no se ejecutarán hasta el momento en que sean requeridas de forma expresa.

¿Dónde deben insertarse?

Aunque en versiones antiguas de PHP era necesario definir la función antes de invocarla, a partir de la versión 4 no es necesaria esa organización secuencial.

La función pueden estar escrita dentro de cualquier script y en cualquier parte del documento, sin que tenga importancia alguna el lugar en el que se incluya la llamada a la misma.

También es posible –y bastante habitual– incluir funciones de uso frecuente en documentos externos de modo que pueden ser compartidas.

En este caso, además de invocarla es necesario indicar a PHP el lugar donde debe buscarla. Hablaremos de ello cuando estudiemos lo relativo a include.

Definición de la función

Las funciones de usuario requieren la siguiente sintaxis:

function nombre(){
.....
... instrucciones ...
.....
}

Es imprescindible respetar estrictamente la sintaxis que requiere de forma obligatoria los siguientes elementos:

– La palabra function debe estar escrita en minúsculas.

– El nombre de la función, que debe seguir criterios similares a los de los nombres de variables, aunque en este caso no se antepone el símbolo $ ni ningún otro.

–Los paréntesis (), incluso cuando no contengan nada.

– Las llaves de apertura ({) y cierre (}) dentro de las cuales se escribirán las instrucciones correspondientes a ella.

Ejecución de la función

Las funciones PHP no se ejecutan en tanto no sean invocadas.

Para invocar una función la sintaxis es la siguiente:

nombre()

Al ser llamada con esta sintaxis –desde cualquier script– se ejecutarán las instrucciones contenidas en ella.

Ámbito de las variables

Resumamos lo ya comentado cuando tratamos el tema de las variables.

– Las funciones no leen valores de variables definidas fuera de su ámbito salvo que dentro de la propia función se definan de forma expresa como globales.

– Si una función modifica el valor de una variable global, el nuevo valor persiste después de abandonar la función.

– Si dentro de una función se utiliza un nombre de variable idéntico al de otra externa a ella (sin definirla global) la nueva variable se inicia con valor nulo y los eventuales valores que pudiera ir conteniendo se pierden en el momento en que se acaba su ejecución.

Asignación de valores a variables

A las variables no globales se les pueden asignar sus valores iniciales de dos formas:

• Incluyéndolas en una línea de instrucciones contenida en la propia función.

• Insertando los nombres de variable y sus valores dentro del paréntesis que –de forma obligatoria– debe seguir al nombre de la función. En este caso la sintaxis sería:

function nom ($a=v1,$b=v2)

donde $a y $b son nombres de variables a utilizar en el ámbito de la función y v1 y v2 los valores asignados a cada una de ellas.

En este paréntesis pueden incluirse –separándolas con comas– cuantas parejas var = val sean necesarias.

• Una forma alternativa a la anterior sería la siguiente:

function nom ($a,$b)

donde habría que asignar los valores de cada una de la variables desde la llamada a la función, que ahora tendría esta sintaxis:

nombre (valor1, valor2,...);

en la que se escriben los valores separados por comas, y encerrados entre comillas cuando se trata de variables alfanuméricas.

Si el número de valores contenidos en la llamada fuera mayor que el número de variables definidas en la función, los excedentes serían ignorados y, si fuera inferior, se asignaría valor nulo a las variables a las que no se transfiriera ningún valor.

• También es posible incluir en la llamada a la función los nombres de algunas variables definidas en el ámbito externo a la función. Se haría de la siguiente forma:

nombre ($var1, var2,...);

Pasar por referencia

Tal como hemos visto, las funciones PHP pueden recibir valores de variables externas y utilizar esos valores sin que el valor original de las mismas –salvo que se les asigne la condición de globales dentro de la función– sufra modificación.

Una manera de lograr que los valores una variable externa puedan ser modificados por una función, es lo que se llama en argot informático «pasar variables por referencia».

La forma de hacerlo es esta:

Hay que anteponer al nombre de la variable el símbolo & y PHP interpretará que la estamos pasando por referencia.

El & puede anteponerse tanto en la definición de la función como en la llamada a la función, tal como puedes ver en el ejemplo.

La segunda de las opciones nos concede mayor libertad dado que permite usar una sola función y decidir en cada llamada la forma de pasar los parámetros.

¡Cuidado!

Si tratas de ejecutar una función en la que colocas el & en la llamada a la función y te aparece un mensaje como este:

«Warning: Call-time pass-by-reference has been deprecated -argument passed by value; If you would like to pass it by reference, modify the declaration of function(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file».

lo que estará ocurriendo es que el php.ini del servidor tiene configurada en Off la directiva:

allow_call_time_pass_reference

y eso suele ocurrir con algunos hostings y también con la configuración por defecto de algunas versiones de PHP anteriores a la que estamos utilizando.


Ejemplos de funciones de usuario


Con este primer ejemplo obtendremos una página en blanco. El script contiene una función pero no hay ninguna instrucción que la invoque y por lo tanto no se ejecutaría.

<?
function a1(){

for($i=1;$i<=10;$i++){
echo $i,"<br>";
}
}
?>




<?
a1();
?>

<!-- Hemos escrito un script con una llamada
a la función a1 que aún no está definida.
Tendremos que hacerlo, pero no importa
la parte del documento en la que lo hagamos
La pondremos en este nuevo script PHP //-->

<?
function a1(){
for($i=1;$i<=10;$i++){
echo $i,"<br>";
}
}
?>






En este otro ejemplo veremos las diversas situaciones que pueden plantearse respecto al ámbito de las variables.

<?
# definamos dos variables y asignémosles un valor
$a=5; $b=47;
# escribamos una funcion a1 y pidámosle que imprima sus valores

function a1(){
echo "Este es el valor de &#36a en la función a1: ",$a,"<br>";
echo "Este es el valor de &#36b en la función a1: ",$b,"<br>";

}
# hagamos una llamada a la funcion anterior
# no nos escribirá ningún valor porque esas variables no pertenecen
# al ámbito de la función y serán consideradas como vacias
# en el ambito de la funcion
a1();
# escribamos una nueva función, definamos como global $a
# y comprobemos que ahora si la hemos incluido en el ambito
# de la funcion
function a2(){
global $a;
echo "Este es el valor de &#36a en la función a2: ",$a,"<br>";
echo "Este es el valor de &#36b en la función a2: ",$b,"<br>";

}
# invoquemos esta nueva funcion y veamos que ahora
# si se visualiza el valor de $a pero no el de $b
a2();
# creemos una nueva funcion y ahora modifiquemos dentro de ella
# ambas variables
function a3(){
global $a;
$a +=45;
$b -=348;
echo "Este es nuevo valor de &#36a en la función a3: ",$a,"<br>";
echo "Este es el valor de &#36b en la función a3: ",$b,"<br>";

}
# invoquemos la funcion a3
a3();

# comprobemos -desde fuera del ámbito de la función
# que ocurrió con los valores de las variables
echo "El valor de &#36a HA CAMBIADO despues de ejecutar a3 es: ",$a,"<br>";
echo "El valor de &#36b NO HA CAMBIADO despues de ejecutar a3 es: ",$b,"<br>";

# probemos que ocurre con una variable superglobal
# veremos que sin ser definida expresamente en a4
# si pertenece a su ambito y por lo tanto visualizamos su contenido
function a4(){
print "La superglobales si están: ".$_SERVER['SERVER_NAME']."<br>";
}
# invoquemos esta nueva funcion
a4();
?>

<?
$a=-13; $b=7482; $c="Ambrosio";

# esta es una forma alternativa de asignar valores a una variable
# del ambito de la función
function a1($a=56, $b=25){
echo "El valor de &#36$a en la función a1: ", $a,"<br>";
echo "El valor de &#36$b en la función a1: ", $b,"<br>";

}
a1();

echo "El valor de $a despues de ejecutar la función es: ",$a,"<br><br>";



# Pasando valores desde la llamada a la función #
/* Definamos una función fun1 e incluyamos dentro de su paréntesis
nombres de variables, separados por comas pero ahora sin asignarles
ningún valor */
function fun1($x,$y,$z){
print "Valor de la variable x: ".$x."<br>";
print "Valor de la variable y: ".$y."<br>";
print "Valor de la variable z: ".$z."<br>";

}



# debemos hacer la llamada a la función pero ahora
# lo haremos de forma distinta.
# Vamos a incluir en la llamada
# los valores que queremos asignar a las variables de la función
# Escribiremos dentro del paréntesis de la llamada
# los valores de cada una de las tres variables
# separados por comas
# (si se trata de una cadena, pongámosla entre comillas)
# y veremos con la función recoge esos valores asignados
#en la llamada

fun1(14,"Robustiano",23.4);
/* si esta llamada contuviera más de tres valores
los ultimos serian ignorados */
fun1(49.3,"Eustaquio",78,"Lupicio",456);
# si contuviera menos de tres valores
# PHP nos daría un mensaje de error
# advirtiendo que falta un valor
# pero nos devolvería los valores
fun1("Desiderio","Bailador");

# esos mensajes de error podríamos evitarlos
# poniendo una arroba delante de la llamada a la función
@fun1("Nuevo Desiderio","Nuevo Bailador");


# tambien podría utilizarse una sintaxis como esta
# en la que dejamos en blanco (entre comillas)
# el espacio correspondiente al segundo valor
# aunque si incluimos las comas.
# La variable que ocupa esa posición
# sería considerada como nula
fun1("La luna",'',"verde");

# también podríamos incluir en la llamada nombres de variables
# definidas en el ámbito general del sript
# un este caso la función usaria esos valores

fun1($a,$b,$c);

?>



<? $a=3; $b=2;
function a1(&$a,$b){
$a=pow($a,2);
$b=pow($b,3);
echo "El cuadrado de a dentro de la función es: ",$a, "<br>";
echo "El cubo de b dentro de la función es: ",$b, "<br><br>";
}

a1($a,$b);

echo "Al salir de la función a conserva la modificación: ",$a, "<br>";
echo "Por el contrario, b no la conserva: ",$b, "<br><br>";

$c=8; $d=12;
function b1($a,$b){
$a=pow($a,2);
$b=pow($b,3);
echo "El cuadrado de a dentro de la función es: ",$a, "<br>";
echo "El cubo de b dentro de la función es: ",$b, "<br><br>";
}

b1(&$c,$d);

echo "Al salir de la función c conserva la modificación: ",$c, "<br>";
echo "Por el contrario, d no la conserva: ",$d, "<br><br>";
?>





Otra forma de definir funciones de usuario

Existe otra opción de definición de funciones de usuario que puede resultar de mucho interés. En este caso la función se define en tres bloques:

Definición de la función, llave de apertura y cierre del script PHP.

Contenido de la función formado exclusivamente por código HTML, que se escribiría cuando fuera invocada la función que lo contiene.

Cierre de la función (llave de cierre) contenido en un script PHP, es decir, entre las etiquetas de apertura y cierre ?> de PHP.

Cuando es invocada una función definida de esta forma –puedes verlo en el ejemplo– PHP se limita a escribir en el documento final los textos contenidos entre la etiqueta de apertura y cierre de la función.

Las funciones de esta forma son particularmente útiles para la construcción de espacios web que contienen una serie de páginas en las que se repiten las mismas estructuras.


Otras funciones de usuario

<? function Encabezado() { ?>
<!-- Hemos abierto la función y cerrado la etiqueta PHP
todo esto es código HTML //-->
<HTML>
<HEAD>
<TITLE>Titulo de mi página</TITLE></HEAD>

<!-- Esta nueva llamada a PHP
insertando la llave de cierre de la función
indicará a PHP que debe escribir todo lo
contenido entre la { y esta } //-->
<? } ?>

<? function Pie() { ?>
<HR>

</HTML>

<? } ?>
<!-- Utilizaremos esas dos funciones para
crear una página web. Llamamos a la función Encabezado
luego escribimos un texto y por ultimo insertamos
el Pie de página con la función Pie //-->
<? Encabezado(); ?>
Este es texto que aparecerá en el cuerpo de la página.
Está fuera de los scripts de php y será considerado
como un texto HTML. Debajo aparecerá la línea horizontal
que insertaremos mediante una nueva llamada a la función Pie


<? Pie(); ?>





viernes, 30 de enero de 2009

Manual de PHP 37. Extraer información: Modificaciones en arrays

Modificaciones en arrays

var= range(inf,sup)

Crea una nueva matriz (var) escalar en la que los valores de los elementos serán los números enteros (ordenados) pertenecientes al intervalo comprendido entre los valores inf y sup, incluidos estos.

Los valores inf y sup deben ser números enteros.

shuffle(array)

Intercambia de modo aleatorio los valores de un array y los reindexa.

Igual que ocurría en caso de los números aleatorios, la función shuffle deberá ir precedida de una semilla del tipo srand.

En el ejemplo hemos usado como semilla la función: srand(time()).

var= array_flip(array)

Devuelve un array (var) que contiene como valores los índices de la matriz array y como índices los valores de aquella.

Como quiera que los valores pueden estar repetidos y no es posible que lo estén los índices, esta función, en caso de valores repetidos, toma cada uno de esos valores una sola vez, lo utiliza como índice del nuevo array y asigna como valor del nuevo elemento el mayor de los índices –del array original– de los elementos que contuvieran ese valor.

Insertando elementos en un arrays

array_unshift(arr, v1,v2,..)

Inserta al principio de la matriz arr los valores v1, v2, etcétera que pueden ser tantos como se deseen y deben estar separados por comas.

array_push(array, v1,v2,..)

Inserta al final de la matriz array los valores v1, v2, etcétera, que igual que en el caso anterior, pueden ser tantos como se deseen y deben estar separados por comas.
Tanto array_unshift como array_push asignan a los nuevos elementos índices numéricos.

array_pad(array, n, var)

Inserta nuevos elementos en array y les asigna el valor contenido en var. Insertará tantos nuevos elementos como sea necesario para que el array alcance una longitud de n elementos.
Si el valor de n es positivo inserta los elementos al final del array, si fuera negativo los insertaría al comienzo del mismo.

A los nuevos elementos del array se les asignan índices numéricos.

array_merge($a, $b)

Crea un nuevo array escalar en el que se incluyen todos los elementos contenidos en los arrays $a y $b.

Quitar elementos de un array

array_shift($a)

La función array_shift extrae el primer elemento del array $a.

array_pop($a)

La función array_pop extrae el último elemento del array $a.

array_slice($a,n)

La función array_slice extrae n elementos del array $a.

Si el valor de n es positivo extraerá todos los elementos a partir del que ocupa la posición n contando desde primero hasta el último según el orden de creación de los elementos.

Si el valor de n es negativo extraerá todos los elementos a partir del enésimo, esta vez, contando desde el último hasta el primero.

array_slice($a,n, m)

La función array_slice con dos parámetros permite extraer una parte de los valores de una matriz siguiendo estos criterios:

Si n y m son positivos, extraerá m elementos a partir del que ocupa la posición enésima de primero a último.

Cuando n es negativo y m es positivo se extraerán m elementos contados a partir del enésimo, esta vez recorriendo el array de último a primero.

En el caso en que n tenga valor positivo y m sea negativo extraerá los comprendidos entre el enésimo contado de primero a último y el emési- mo contado desde el último hasta el primero.

Si n es negativo y m es también negativo extraerá los caracteres comprendidos entre el enésimo contado de último a primero y el emésimo contado en el mismo sentido.

En este caso se requiere que el valor absoluto de n sea mayor que el de m.

En caso de no cumplirse esta condición devolverá un array vacío.

Invertir el orden de un array

array_reverse(array)

Devuelve un nuevo array cuyos elementos están en orden inverso al del array original.

De esta forma el elemento que ocupaba la última posición pasa a ocupar la primera y así sucesivamente.

¡Cuidado!

Recuerda que las posiciones iniciales de los elementos de un array no tienen relación con sus índices sino con la secuencia en la que fueron creados.

Y otra cosa, mucho cuidado con la aplicación de todas estas funciones y con los índices de los arrays resultantes.



Modificación 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")
;
$C=array(
"b" =>"verde",
"c" =>"rojo",
"e" =>"verde",
"f" =>"Rojo",
"g" =>"Verde",
"a"=>"rojo",
"d" =>"rojo")
;

echo "<h3>Crea una matriz de números enteros</h3>";

$r=range(7,11);

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

echo "<h3>Intercambia aleatoriamente elementos en una matriz</h3>";

srand (time());
shuffle ($r);


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

echo "<h3>Intercambia valores e indices</h3>";

$p=array_flip($a);

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

$q=array_flip($c);

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

echo "<h3>Inserta elementos al principio de una matriz</h3>" ;

array_unshift($a,97,"Pepe",128);

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

array_unshift($c,97,"Pepe",128);

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

echo "<h3>Inserta elementos al final de una matriz</h3>";

array_push($a,3.4,"Luis",69);

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

array_push($c,3.4,"Luis",69);

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

echo "<h3>Inserta elementos iguales
al principio o al final de una matriz</h3>";

$wz1=array_pad($a,25,"relleno");

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

echo "<br>";

$wz2=array_pad($c,-17,"relleno");

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

echo "<h3>Fusiona dos matrices</h3>";

$wz3=array_merge($a,$b);

foreach($wz3 as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor,"<br>";
}
echo "<h3>Extrae el primer elemento de una matriz</h3>";

array_shift ($a);

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

array_shift ($c);

foreach($c as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor,"<br>";
}
echo "<h3>Extrae el ultimo elemento de una matriz</h3>";

array_pop($a);

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

array_pop ($c);

foreach($c as $clave=>$valor){
echo "Clave: ",$clave," Valor: ",$valor,"<br>";
}
echo "<h3>Extrae elementos de una matriz</h3>";

$zz1=array_slice($a,3);

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

$zz2=array_slice($a,-3);

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

echo "<br>";

$zz3=array_slice($b,3,4);

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

echo "<br>";

$zz4=array_slice($b,3,-2);

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

echo "<br>";

$zz5=array_slice($b,-5,-2);

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

echo "<h3>Invierte los elementos de la matriz</h3>";

$inv=array_reverse($C);

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




Fíjate en los ejemplos y verás que algunas estas funciones reindexan los resultados y los convierten en escalares aún en el caso de que originalmente fueran asociativos.





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>";

}

?>








Manual de PHP 35. Extraer información: Recuentos en Arrays

Recuento de los valores contenidos en una matriz

Algunas de las posibilidades de obtener información sobre los contenidos de un array son las siguientes:

$n=array_count_values(ar)

Con array_count_values la variable $n será un array que tendrá como índices cada uno de los valores distintos que contenga el array ar, y como valores el resultado de contar el número de veces que se repite cada uno de los valores contenidos en el array inicial.

Distingue entre mayúsculas y minúsculas.

Cuando el array inicial (ar) contiene números enteros (sea ar escalar o asociativo) $n será un array escalar. En caso contrario, será asociativo.

Búsqueda de elementos en un array

clav=array_keys(arr)

Devuelve un array escalar (clav) que contiene como valores los índices del array inicial (arr).

clav=array_keys(arr, valor)

Devuelve un array escalar (clav) que contiene como valores los índices de los elementos del array inicial cuyo valor coincide con el indicado mediante el parámetro valor.

valores=array_values(arr)

Esta función recoge en una nueva matriz (valores) todos los valores contenidos en otro array.

Es una forma de conversión de un array asociativo en otro escalar.


Recuento de valores

<?
$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>Cuenta valores del array()</h3>";
$contador=array_count_values($a);
foreach($contador as $valor=>$veces){
echo "El valor ",$valor," se repite ",
$veces," en la matriz a<br>";
}
echo $contador[0],"<br>";
echo $contador[1],"<br>";
echo $contador[2],"<br>";
echo $contador[3],"<br>";
echo $contador[4],"<br>";
$contador1=array_count_values($b);
foreach($contador1 as $valor=>$veces){
echo "El valor ",$valor," se repite ",
$veces," en la matriz a<br>";
}
echo $contador1["blanco"],"<br>";
echo $contador1["azul"],"<br>";
echo $contador1["Azul"],"<br>";
echo $contador1["Blanco"],"<br>";
$contador2=array_count_values($c);
foreach($contador2 as $valor=>$veces){
echo "El valor ",$valor," se repite ",$veces," en la matriz a<br>";
}
echo $contador2["rojo"],"<br>";
echo $contador2["Verde"],"<br>";
echo $contador2["verde"],"<br>";
echo $contador2["Rojo"],"<br>";
echo "$lt;h3>Devuelve las claves de un array$lt;/h3>";
$claves=array_keys($a);
foreach($claves as $v){
echo "El valor ",$v," es una de las claves$lt;br>";
}
$claves1=array_keys($a,1);
foreach($claves1 as $v){
echo "El valor ",$v," es una de las claves de elementos
de la matriz cuyo valor es <b>1</b><br>";
}
echo "<h3>Devuelve los valores de un array</h3>";
$valores=array_values($c);
foreach($valores as $v){
echo ,$v," Este es un de los valores de
de la matriz c<br>";
}
?>








Fuente:
Página del ifstic: http://www.isftic.mepsyd.es/formacion/enred/

Manual de PHP 34. Extraer Información: Sobre variables

Obtener información sobre variables

Veremos aquí algunas de las múltiples funciones que nos permiten obtener información sobre arrays y variables.

sizeof(variable)

La función sizeof devuelve el número de elementos de un array.

Si se aplica sobre una variable (no array) devolverá uno y tanto si se aplica sobre un array vacío, una variable con valor nulo o sobre una variable no definida, devolverá cero.

count(variable)

Tiene idéntica funcionalidad a la de sizeof.

isset(variable)

La función isset comprueba si una variable está definida o no lo está. Si lo está –incluso con valor nulo o como array vacío– isset devolverá UNO, en caso contrario devolverá NUL.

Esta función puede ser un complemento de sizeof o de count dado que permitiría comprobar si están definidas las variables en las que aquellas funciones devuelven dimensión cero.

is_array(variable)

Devuelve UNO (verdadero) en el caso de que la variable sea tipo array y NUL en el caso contrario.

is_long(variable)
ó
is_int(variable)
ó
is_integer(variable)

Estas tres funciones –que son idénticas– devuelven UNO en el caso de que la variable sea de tipo entero y NUL en el caso contrario.

is_float(variable)
ó
is_double(variable)

Estas dos funciones –también idénticas– devuelven UNO en el caso de que la variable sea de tipo coma flotante y NUL en el caso contrario.

is_string(variable)

Devuelve UNO en el caso de que la variable sea tipo string y NUL en caso contrario.

unset(variable)

Destruye la variable indicada. Si después de aplicar unset sobre una variable aplicamos de nuevo la función isset, nos devolverá NUL indicando que ya no está definida.

La función unset se puede aplicar tanto sobre variables como sobre un array y también sobre un elemento de un array.


Tamaños de arrays




<?
$a=array("Lunes","Martes","Miercoloes","Jueves",
"Viernes","Sábado","Domingo")
;
$b=array(
"Precio" => "17340 euros",
"Color" => "Rojo",
"Llantas" => "Aluminio")
;
$c=47; $d=""; $e=array();

echo "<h3>Valores usando sizeof()</h3>";

echo " a tiene: ",sizeof($a)," elementos<br>";
echo " b tiene: ",sizeof($b)," elementos<br>";
echo " c tiene: ",sizeof($c)," elementos<br>";
echo " d tiene: ",sizeof($d)," elementos<br>";
echo " e tiene: ",sizeof($e)," elementos<br>";
echo " f tiene: ",sizeof($f)," elementos<br>";

echo "<h3>Valores usando count()</h3>";
echo " a tiene: ",count($a)," elementos<br>";
echo " b tiene: ",count($b)," elementos<br>";
echo " c tiene: ",count($c)," elementos<br>";
echo " d tiene: ",count($d)," elementos<br>";
echo " e tiene: ",count($e)," elementos<br>";
echo " f tiene: ",count($f)," elementos<br>";

?>



Información sobre variables



<?
$a=array("Lunes","Martes","Miercoloes","Jueves",
"Viernes","Sábado","Domingo")
;
$b=array(
"Precio"=>"17340 euros",
"Color" =>"Rojo",
"Llantas" =>"Aluminio")
;
$c=47; $d=""; $e=array();

echo "<h3>Variables definidas</h3>";

echo " ¿Esta definida la variable a ? ",isset($a),"<br>";
echo " ¿Esta definida la variable b ? ",isset($b),"<br>";
echo " ¿Esta definida la variable c ? ",isset($c),"<br>";
echo " ¿Esta definida la variable d ? ",isset($d),"<br>";
echo " ¿Esta definida la variable e ? ",isset($e),"<br>";
echo " ¿Esta definida la variable f ? ",isset($f),"<br>";

echo "<h3>Identificación de tipos de variables</h3>";

echo " ¿La variable a es un array ? ",is_array($a),"<br>";
echo " ¿La variable a es tipo double ? ",is_double($a),"<br>";
echo " ¿La variable a es un entero ? ",is_int($a),"<br>";
echo " ¿La variable a es un entero ? ",is_long($a),"<br>";

echo "<h3>Eliminando variables</h3>";

echo "La dimensión de a es: ",count($a),"<br>";
unset($a[0]);
echo "Nueva dimensión de a: ",count($a),"<br>";
echo "La dimensión de b es: ",count($b),"<br>";
unset($b);
echo "Nueva dimensión de b: ",count($b),"<br>";
echo " ¿Sigue definida la variable b ? ",isset($b),"<br>";
?>







Fuente:
Página del ifstic: http://www.isftic.mepsyd.es/formacion/enred/




jueves, 29 de enero de 2009

Manual de PHP 33. Bucles: foreach

El bucle foreach

El bucle foreach es específico de los array y aplicable a ellos tanto si son escalares como si son de tipo asociativo.

Tiene dos posibles opciones. En una de ellas lee únicamente los valores contenidos en cada elemento del array. En el otro caso lee además los índices del array.

Lectura de valores

Utiliza la sintaxis:

foreach( array as var ){
...instrucciones...
}

donde array es el nombre del array (sin incluir índices ni corchetes), as es una palabra obligatoria y var el nombre de una variable (puede ser creada al escribir la instrucción ya que no requiere estar previamente definida).
Las instrucciones escritas entre las { } permiten el tratamiento o visualización de los valores obtenidos.
La variable var no podrá ser utilizada para guardar valores. Hemos de tener en cuenta que su valor se rescribe en cada iteración del bucle y que al acabar este sólo contendrá el último de los valores leídos.

Lectura de índices y valores

Con una sintaxis como la que sigue se pueden leer no sólo los valores de un array sino también sus índices.

foreach( array as v1 => v2 ) {
...instrucciones...
}

donde array es el nombre de la matriz, as es una palabra obligatoria, v1 es el nombre de la variable que recogerán los índices, los caracteres => (son obligatorios) son el separador entre ambas variables y, por último, v2 es el nombre de la variable que recoge el valor de cada uno de los elementos del array.

Tanto esta función como la anterior realizan una lectura secuencial que comienza en el primer valor del array.

Arrays bidimensionales

Cuando se trata de arrays bidimensionales la lectura de los valores que contienen sus elementos requiere el uso de dos bucles anidados.

Cuando un array de este tipo es sometido al bucle foreach se extrae como índice el primero de ellos y como valor un array unidimensional que tiene como índice el segundo del array original y como valor el de aquél.

La lectura de los valores de cada elemento requiere utilizar un segundo bucle que los vaya extrayendo a partir del array unidimensional obtenido por medio del bucle previo.

La sintaxis sería de este tipo:

foreach($a as $i1=>$na){

foreach($na as $i2=>$val){

..$i1 es el primer índice...
..$i2 es el segundo índice...
..$na nuevo array
..$valor es el valor
....
}
}

En el caso de arrays con dimensiones superiores sería necesario proceder del mismo modo, y habría que utilizar tantos bucles foreach como índices contuviera el array.


El bucle foreach

<?
/* definimos un array escalar utilizando la sintaxis
nombre del array=array (valores de los elemento separados por comas)
si los valores son números no es necesario encerrarlos entre comillas */
$a=array("a","b","c","d","e");
/* definamos ahora un nuevo array, esta vez asociativo
utilizando la sintaxis clave => valor tal como puedes ver */
$b=array(
"uno" =>"Primer valor",
"dos" =>"Segundo valor",
"tres" =>"Tecer valor",
)
;
# establecemos el bucle que leerá el array $a
# recogiendo en la variable $pepe los valores extraidos
# y escribimos lo valores
foreach($a as $pepe) {
echo $pepe,"<br>";
};
# repetimos el mismo proceso, ahora con $b que es un array asociativo
foreach($b as $pepe) {
echo $pepe,"<br>";
};
?>


<?
$a=array("a","b","c","d","e");
$b=array(
"uno" =>"Primer valor",
"dos" =>"Segundo valor",
"tres" =>"Tecer valor",
)
;

# en este caso extraeremos índices y valores de ambos arrays
# usaremos $pepe para recoger los índices y $pepe para recoger los valores
# y separaremos ambas variables por => que es el separador obligatorio
# para estos casos

foreach($a as $pepe=>$pepa) {
echo "Indice: ",$pepe," Valor: ",$pepa,"<br>";
};
foreach($b as $pepe=>$pepa) {
echo "Indice: ",$pepe," Valor: ",$pepa,"<br>";
};
?>



El bucle foreach en arrays bidimensionales

<?
# definamos un array bidimensional
$z=array(
0 => array (
0 => 34,
1 => 35,
2 => 36,
),
1 => array (
0 => 134,
1 => 135,
2 => 136,
)
);

# intentemos leer indices y valores mediante un bucle foreach
# y veamos como los valores que extraemos son Arrays (unidimensionales)
# consecuencia del caracter bidimensional del array original

foreach($z as $pepe=>$pepa) {
echo "Indice: ",$pepe," Valor: ",$pepa,"<br>";
};
/* anidemos dos bucles foreach de la siguiente forma
en el primero extraemos un array que es tratado por
el segundo foreach para extraer el segundo indice
y el valor realmente contenido en ese elemento bidimensional */
foreach($z as $ind1=>$valor1) {
foreach($valor1 as $ind2=>$valorReal) {
echo "Ind. 1: ",$ind1,"Ind. 2: ",$ind2," Valor: ",$valorReal,"<br>";
};
};

?>


<--Anterior ------- Índice del manual ------- Siguiente -->

Fuente:
Página del ifstic: http://www.isftic.mepsyd.es/formacion/enred/