0% encontró este documento útil (0 votos)
36 vistas

PHP Matrices

Este documento trata sobre la precisión de los números de punto flotante en computación. Explica que algunas fracciones decimales comunes como 0.1 o 0.7 no pueden representarse exactamente en binario sin perder precisión, lo que puede dar como resultado cálculos incorrectos. También señala que algunas fracciones como 1/3 no pueden expresarse de forma exacta con un número finito de dígitos decimales. Por lo tanto, nunca se debe confiar ciegamente en los últimos dígitos de un número de punto flotante ni compararlos directamente para verificar si son

Cargado por

IsraMtz
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
36 vistas

PHP Matrices

Este documento trata sobre la precisión de los números de punto flotante en computación. Explica que algunas fracciones decimales comunes como 0.1 o 0.7 no pueden representarse exactamente en binario sin perder precisión, lo que puede dar como resultado cálculos incorrectos. También señala que algunas fracciones como 1/3 no pueden expresarse de forma exacta con un número finito de dígitos decimales. Por lo tanto, nunca se debe confiar ciegamente en los últimos dígitos de un número de punto flotante ni compararlos directamente para verificar si son

Cargado por

IsraMtz
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 17

Precisión del punto flotante

Es bastante común que algunas fracciones decimales simples como 0.1 o 0.7 no puedan ser
convertidas a su representación binaria interna sin perder un poco de precisión. Esto puede llevar a
resultados confusos: por ejemplo, floor((0.1+0.7)*10) usualmente devolverá 7 en lugar del
esperado 8 ya que el resultado de la representación interna es en realidad algo como
7.9999999999....

Esto se encuentra relacionado al hecho de que es imposible expresar de forma exacta algunas
fracciones en notación decimal con un número finito de dígitos. Por ejemplo, 1/3 en forma
decimal se convierte en 0.3333333. . ..

Así que nunca confíe en resultados de números flotantes hasta el último dígito, y nunca compare
números de punto flotante para conocer si son ñalentes. Si realmente necesita una mejor precisión,
es buena idea que use las funciones matemáticas de precisión arbitraria o las funciones gmp en su
lugar.

Conversión a flotante

Para más información sobre cuándo y cómo son convertidas las cadenas a flotantes, vea la sección
titulada Conversión de cadenas a números. Para valores de otros tipos, la conversión es la misma
que si el valor hubiese sido convertido a entero y luego a flotante. Vea la sección Conversión a
entero para más información.

Cadenas
Un valor string es una serie de caracteres. En PHP, un caracter es lo mismo que un byte, es decir,
hay exactamente 256 tipos de caracteres diferentes. Esto implica también que PHP no tiene soporte
nativo de Unicode. Vea utf8_encode() y utf8_decode() para conocer sobre el soporte Unicode.

Nota: El que una cadena se haga muy grande no es un problema. PHP no impone límite
práctico alguno sobre el tamaño de las cadenas, así que no hay ninguna razón para
preocuparse sobre las cadenas largas.

Sintaxis

Un literal de cadena puede especificarse en tres formas diferentes.

• comillas simples

• comillas dobles

• sintaxis heredoc

Comillas simples

La forma más simple de especificar una cadena sencilla es rodearla de comillas simples (el caracter
').
Para especificar una comilla sencilla literal, necesita escaparla con una barra invertida (\), como en
muchos otros lenguajes. Si una barra invertida necesita aparecer antes de una comilla sencilla o al
final de la cadena, necesitará doblarla. Note que si intenta escapar cualquier otro caracter, ¡la barra
invertida será impresa también! De modo que, por lo general, no hay necesidad de escapar la barra
invertida misma.

Nota: En PHP 3, se generará una advertencia de nivel E_NOTICE cuando esto ocurra.

Nota: A diferencia de las otras dos sintaxis, las variables y secuencias de escape para
caracteres especiales no serán expandidas cuando ocurren al interior de cadenas entre
comillas sencillas.

<?php
echo 'esta es una cadena simple';

echo 'Tambi&eacute;n puede tener saltos de l&iacute;nea embebidos


en las cadenas de esta forma, ya que
es v&aacute;lido';

// Imprime: Arnold dijo una vez: "I'll be back"


echo 'Arnold dijo una vez: "I\'ll be back"';

// Imprime: Ha eliminado C:\*.*?


echo 'Ha eliminado C:\\*.*?';

// Imprime: Ha eliminado C:\*.*?


echo 'Ha eliminado C:\*.*?';

// Imprime: Esto no va a expandirse: \n una nueva linea


echo 'Esto no va a expandirse: \n una nueva linea';

// Imprime: Las variables no se $expanden $tampoco


echo 'Las variables no se $expanden $tampoco';
?>

Comillas dobles

Si la cadena se encuentra rodeada de comillas dobles ("), PHP entiende más secuencias de escape
para caracteres especiales:

Tabla 11-1. Caracteres escapados

secuencia significado
\n alimentación de línea (LF o 0x0A (10) en ASCII)
\r retorno de carro (CR o 0x0D (13) en ASCII)
\t tabulación horizontal (HT o 0x09 (9) en ASCII)
\\ barra invertida
\$ signo de dólar
\" comilla-doble
la secuencia de caracteres que coincide con la expresión regular es un caracter
\[0-7]{1,3}
en notación octal
\x[0-9A-Fa-f] la secuencia de caracteres que coincide con la expresión regular es un caracter
{1,2} en notación hexadecimal
Nuevamente, si intenta escapar cualquier otro caracter, ¡la barra invertida será impresa también!
Pero la característica más importante de las cadenas entre comillas dobles es el hecho de que los
nombres de variables serán expandidos. Vea procesamiento de cadenas para más detalles.

Heredoc

Otra forma de delimitar cadenas es mediante el uso de la sintaxis heredoc ("<<<"). Debe indicarse
un identificador después de la secuencia <<<, luego la cadena, y luego el mismo identificador para
cerrar la cita.

El identificador de cierre debe comenzar en la primera columna de la línea. Asimismo, el


identificador usado debe seguir las mismas reglas que cualquier otra etiqueta en PHP: debe contener
solo caracteres alfanuméricos y de subrayado, y debe iniciar con un caracter no-dígito o de
subrayado.

Aviso
Es muy importante notar que la línea con el identificador de cierre no contenga otros caracteres,
excepto quizás por un punto-y-coma (;). Esto quiere decir en especial que el identificador no debe
usar sangría, y no debe haber espacios o tabuladores antes o después del punto-y-coma. Es
importante también notar que el primer caracter antes del identificador de cierre debe ser un salto
de línea, tal y como lo defina su sistema operativo. Esto quiere decir \r en Macintosh, por ejemplo.

Si esta regla es rota y el identificador de cierre no es "limpio", entonces no se considera un


identificador de cierre y PHP continuará en busca de uno. Si, en tal caso, no se encuentra un
identificador de cierre apropiado, entonces un error del analizador sintáctico resultará con el
número de línea apuntando al final del script.
El texto heredoc se comporta tal como una cadena entre comillas dobles, sin las comillas dobles.
Esto quiere decir que no necesita escapar tales comillas en sus bloques heredoc, pero aun puede usar
los códigos de escape listados anteriormente. Las variables son expandidas, aunque debe tenerse el
mismo cuidado cuando se expresen variables complejas al interior de un segmento heredoc, al igual
que con otras cadenas.
Ejemplo 11-3. Ejemplo de uso de una cadena heredoc
<?php
$cadena = <<<FIN
Ejemplo de una cadena
que se extiende por varias l&iacute;neas
usando la sintaxis heredoc.
FIN;

/* Un ejemplo mas complejo, con variables. */


class foo
{
var $foo;
var $bar;

function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}

$foo = new foo();


$nombre = 'MiNombre';

echo <<<FIN
Mi nombre es "$nombre". Estoy imprimiendo algo de $foo->foo.
Ahora, estoy imprimiendo algo de {$foo->bar[1]}.
Esto deber&iacute;a imprimir una letra 'A' may&uacute;scula: \x41
FIN;
?>
Nota: El soporte heredoc fue agregado en PHP 4.

Procesamiento de variables

Cuando una cadena es especificada en comillas dobles o al interior de un bloque heredoc, las
variables son interpretadas en su interior.

Existen dos tipos de sintaxis: una simple y una compleja. La sintaxis simple es la más común y
conveniente. Esta ofrece una forma de interpretar una variable, un valor array, o una propiedad de
un object.

La sintaxis compleja fue introducida en PHP 4, y puede reconocerse por las llaves que rodean la
expresión.

Sintaxis simple

Si un signo de dólar ($) es encontrado, el analizador sintáctico tomará ambiciosamente tantos


lexemas como le sea posible para formar un nombre de variable válido. Rodee el nombre de la
variable de llaves si desea especificar explícitamente el final del nombre.

<?php
$cerveza = 'Heineken';
echo "El sabor de varias $cerveza's es excelente"; // funciona, "'" no es un caracter valido para
echo "Tom&oacute; algunas $cervezas"; // no funciona, 's' es un caracter valido para nombres de
echo "Tom&oacute; algunas ${cerveza}s"; // funciona
echo "Tom&oacute; algunas {$cerveza}s"; // funciona
?>
De forma similar, puede hacer que un índice de un array o una propiedad de un object sean
interpretados. En el caso de los índices de matrices, el corchete cuadrado de cierre (]) marca el final
del índice. Para las propiedades de objetos, se aplican las mismas reglas de las variables simples,
aunque con las propiedades de objetos no existe un truco como el que existe con las variables.

<?php
// Estos ejemplos son especificos al uso de matrices al interior de
// cadenas. Cuando se encuentre por fuera de una cadena, siempre rodee
// de comillas las claves tipo cadena de su matriz, y no use
// {llaves} por fuera de cadenas tampoco.

// Mostremos todos los errores


error_reporting(E_ALL);

$frutas = array('fresa' => 'roja', 'banano' => 'amarillo');

// Funciona pero note que esto trabaja de forma diferente por fuera de
// cadenas entre comillas
echo "Un banano es $frutas[banano].";

// Funciona
echo "Un banano es {$frutas['banano']}.";

// Funciona, pero PHP musca una constante llamada banano primero, como
// se describe mas adelante.
echo "Un banano es {$frutas[banano]}.";

// No funciona, use llaves. Esto resulta en un error de analisis sintactico.


echo "Un banano es $frutas['banano'].";

// Funciona
echo "Un banano es " . $frutas['banano'] . ".";

// Funciona
echo "Este cuadro tiene $cuadro->ancho metros de ancho.";

// No funciona. Para una solucion, vea la sintaxis compleja.


echo "Este cuadro tiene $cuadro->ancho00 cent&iacute;metros de ancho.";
?>
Para cualquier cosa más sofisticada, debería usarse la sintaxis compleja.

Sintaxis compleja (llaves)

Esta no es llamada compleja porque la sintaxis sea compleja, sino porque es posible incluir
expresiones complejas de esta forma.

De hecho, de esta forma puede incluir cualquier valor que sea parte del espacio de nombres al
interior de cadenas. Simplemente escriba la expresión en la misma forma que lo haría si se
encontrara por fuera de una cadena, y luego la ubica entre { y }. Ya que no es posible escapar '{',
esta sintaxis será reconocida únicamente cuando el caracter $ se encuentra inmediatamente después
de {. (Use "{\$" o "\{$" para obtener una secuencia literal "{$"). Algunos ejemplos para aclarar el
asunto:
<?php
// Mostremos todos los errores
error_reporting(E_ALL);

$genial = 'fant&aacute;stico';

// No funciona, imprime: Esto es { fant&aacute;stico}


echo "Esto es { $genial}";

// Funciona, imprime: Esto es fant&aacute;stico


echo "Esto es {$genial}";
echo "Esto es ${genial}";

// Funciona
echo "Este cuadro tiene {$cuadro->ancho}00 cent&iacute;metros de ancho.";

// Funciona
echo "Esto funciona: {$matriz[4][3]}";

// Esto esta mal por la misma razon por la que $foo[bar] esta mal por
// fuera de una cadena. En otras palabras, aun funciona pero ya que
// PHP busca primero una constante llamada foo, genera un error de
// nivel E_NOTICE (constante indefinida).
echo "Esto esta mal: {$matriz[foo][3]}";

// Funciona. Cuando se usan matrices multi-dimensionales, use siempre


// llaves alrededor de las matrices al interior de cadenas
echo "Esto funciona: {$matriz['foo'][3]}";

// Funciona.
echo "Esto funciona: " . $arr['foo'][3];

echo "Puede incluso escribir {$obj->valores[3]->nombre}";

echo "Este es el valor de la variable llamada $nombre: {${$nombre}}";


?>

Acceso a cadenas y modificación por caracter

Los caracteres al interior de una cadena pueden ser consultados y modificados al especificar el
desplazamiento, comenzando en cero, del caracter deseado después de la cadena entre llaves.

Nota: Para efectos de compatibilidad con versiones anteriores, aun puede usar corchetes
tipo matriz para el mismo propósito. Sin embargo, esta sintaxis es obsoleta a partir de
PHP 4.

Ejemplo 11-4. Algunos ejemplos de cadenas


<?php
// Obtener el primer caracter de una cadena
$cadena = 'Esta es una prueba.';
$primer = $cadena{0};

// Obtener el tercer caracter de una cadena


$tercer = $cadena{2};

// Obtener el ultimo caracter de una cadena.


$cadena = 'Esta es tambien una prueba.';
$ultimo = $cadena{strlen($cadena)-1};

// Modificar el ultimo caracter de una cadena


$cadena = 'Observe el mar';
$cadena{strlen($cadena)-1} = 'l';

?>
Funciones y operadores útiles
Las cadenas pueden ser concatenadas usando el operador '.' (punto). Note que el operador '+'
(adición) no funciona para este propósito. Por favor refiérase a la sección Operadores de cadena
para más información.

Existen bastantes funciones útiles para la modificación de cadenas.

Vea la sección de funciones de cadena para consultar funciones de uso general, o las funciones de
expresiones regulares para búsquedas y reemplazos avanzados (en dos sabores: Perl y POSIX
extendido).

Existen también funciones para cadenas tipo URL, y funciones para encriptar/descifrar cadenas
(mcrypt y mhash).

Finalmente, si aun no ha encontrado lo que busca, vea también las funciones de tipo de caracter.

Conversión a cadena

Es posible convertir un valor a una cadena usando el moldeamiento (string), o la función strval().
La conversión a cadena se realiza automáticamente para usted en el contexto de una expresión
cuando se necesita una cadena. Esto ocurre cuando usa las funciones echo() o print(), o cuando
compara el valor de una variable con una cadena. El contenido de las secciones del manual sobre
Tipos y Manipulación de Tipos ayudan a aclarar este hecho. Vea también settype().

Un valor boolean TRUE es convertido a la cadena "1", el valor FALSE se representa como "" (una
cadena vacía). De esta forma, usted puede convertir de ida y vuelta entre valores booleanos y de
cadena.

Un número integer o de punto flotante (float) es convertido a una cadena que representa el número
con sus dígitos (incluyendo la parte del exponente para los números de punto flotante).

Las matrices son siempre convertidas a la cadena "Array", de modo que no puede volcar los
contenidos de un valor array con echo() o print() para ver lo que se encuentra en su interior. Para
ver un elemento, usted tendría que hacer algo como echo $arr['foo']. Vea más adelante algunos
consejos sobre el volcado/vista del contenido completo.

Los objetos son convertidos siempre a la cadena "Object". Si quisiera imprimir los valores de
variables miembro de un object para efectos de depuración, lea los parágrafos siguientes. Si quiere
conocer el nombre de clase del cual un objeto dado es instancia, use get_class().

Los recursos son siempre convertidos a cadenas con la estructura "Resource id #1" en donde 1 es el
número único del valor resource asignado por PHP durante tiempo de ejecución. Si quisiera
obtener el tipo del recurso, use get_resource_type().

NULL se convierte siempre a una cadena vacía.

Como puede apreciar, el imprimir matrices, objetos o recursos no le ofroce información útil sobre
los valores mismos. Consulte las funciones print_r() y var_dump() para conocer mejores formas
de imprimir valores para depuración.

También puede convertir valores PHP a cadenas y almacenarlas permanentemente. Este método es
conocido como seriación, y puede ser efectuado con la función serialize(). También puede seriar
valores PHP a estructuras XML, si cuenta con soporte WDDX en su configuración de PHP.

Conversión de cadenas a números


Cuando una cadena es evaluada como un valor numérico, el valor resultante y su tipo son
determinados como sigue.

La cadena será evaluada como un float si contiene cualquier caracter entre '.', 'e', o 'E'. De otra
forma, evaluará como un entero.

El valor es dado por la porción inicial de la cadena. Si la cadena comienza con datos numéricos
válidos, éstos serán el valor usado. De lo contrario, el valor será 0 (cero). Un signo opcional es
considerado un dato numérico válido, seguido por uno o más dígitos (que pueden contener un punto
decimal), seguidos por un exponente opcional. El exponente es una 'e' o 'E' seguida de uno o más
dígitos.

<?php
$foo = 1 + "10.5"; // $foo es flotante (11.5)
$foo = 1 + "-1.3e3"; // $foo es flotante (-1299)
$foo = 1 + "bob-1.3e3"; // $foo es entero (1)
$foo = 1 + "bob3"; // $foo es entero (1)
$foo = 1 + "10 Cerditos"; // $foo es entero (11)
$foo = 4 + "10.2 Cerditos"; // $foo es flotante (14.2)
$foo = "10.0 cerdos " + 1; // $foo es flotante (11)
$foo = "10.0 cerdos " + 1.0; // $foo es flotante (11)
?>
Para más información sobre esta conversión, vea la página del manual Unix sobre strtod(3).

Si quisiera probar cualquiera de los ejemplos presentados en esta sección, puede cortar y pegar los
ejemplos e insertar la siguiente línea para verificar por sí mismo lo que está sucediendo:

<?php
echo "\$foo==$foo; tipo es " . gettype ($foo) . "<br />\n";
?>
No espere obtener el código de un caractar convirtiéndolo a un entero (como lo haría en C, por
ejemplo). Use las funciones ord() y chr() para convertir entre códigos de caracter y caracteres.

Matrices
Una matriz en PHP es en realidad un mapa ordenado. Un mapa es un tipo de datos que asocia
valores con claves. Este tipo es optimizado en varias formas, de modo que puede usarlo como una
matriz real, o una lista (vector), tabla asociativa (caso particular de implementación de un mapa),
diccionario, colección, pila, cola y probablemente más. Ya que puede tener otra matriz PHP como
valor, es realmente fácil simular árboles.

Una explicación sobre tales estructuras de datos se encuentra por fuera del propósito de este manual,
pero encontrará al menos un ejemplo de cada uno de ellos. Para más información, le referimos a
literatura externa sobre este amplio tema.
Sintaxis

Especificación con array()

Un array puede ser creado por la construcción de lenguaje array(). Ésta toma un cierto número de
parejas clave => valor separadas con coma.

array( [clave =>] valor


, ...
)
// clave puede ser un integer o string
// valor puede ser cualquier valor

<?php
$matriz = array("foo" => "bar", 12 => true);

echo $matriz["foo"]; // bar


echo $matriz[12]; // 1
?>
Una clave puede ser un integer o un string. Si una clave es la representación estándar de un integer,
será interpretada como tal (es decir, "8" será interpretado como 8, mientras que "08" será
interpretado como "08"). No existen tipos diferentes para matrices indexadas y asociativas en PHP;
sólo existe un tipo de matriz, el cual puede contener índices tipo entero o cadena.

Un valor puede ser de cualquier tipo en PHP.

<?php
$matriz = array("unamatriz" => array(6 => 5, 13 => 9, "a" => 42));

echo $matriz["unamatriz"][6]; // 5
echo $matriz["unamatriz"][13]; // 9
echo $matriz["unamatriz"]["a"]; // 42
?>
Si no especifica una clave para un valor dado, entonces es usado el máximo de los índices enteros, y
la nueva clave será ese valor máximo + 1. Si especifica una clave que ya tiene un valor asignado,
ése valor será sobrescrito.

<?php
// Esta matriz es la misma que ...
array(5 => 43, 32, 56, "b" => 12);

// ...esta matriz
array(5 => 43, 6 => 32, 7 => 56, "b" => 12);
?>

Aviso
A partir de PHP 4.3.0, el comportamiento de generación de índices descrito ha cambiado. Ahora,
si agrega un elemento a una matriz cuya clave máxima actual es un valor negativo, entonces la
siguiente clave creada será cero (0). Anteriormente, el nuevo índice hubiera sido establecido a la
clave mayor existente + 1, al igual que con los índices positivos.
Al usar TRUE como clave, el valor será evaluado al integer 1. Al usar FALSE como clave, el valor
será evaluado al integer 0. Al usar NULL como clave, el valor será evaluado a una cadena vacía. El
uso de una cadena vacía como clave creará (o reemplazará) una clave con la cadena vacía y su valor;
no es lo mismo que usar corchetes vacíos.

No es posible usar matrices u objetos como claves. Al hacerlo se producirá una advertencia: Illegal
offset type.
Creación/modificación con sintaxis de corchetes cuadrados

Es posible modificar una matriz existente al definir valores explícitamente en ella.

Esto es posible al asignar valores a la matriz al mismo tiempo que se especifica la clave entre
corchetes. También es posible omitir la clave, agregar una pareja vacía de corchetes ("[]") al
nombre de la variable en ese caso.
$matriz[clave] = valor;
$matriz[] = valor;
// clave puede ser un integer o string
// valor puede ser cualquier valor
Si $matriz no existe aun, ésta será creada. De modo que esta es también una forma alternativa de
especificar una matriz. Para modificar un cierto valor, simplemente asigne un nuevo valor a un
elemento especificado con su clave. Si desea remover una pareja clave/valor, necesita eliminarla
mediante unset().

<?php
$matriz = array(5 => 1, 12 => 2);

$matriz[] = 56; // Esto es igual que $matriz[13] = 56;


// en este punto del script

$matriz["x"] = 42; // Esto agrega un nuevo elemento a la


// matriz con la clave "x"

unset($matriz[5]); // Esto elimina el elemento de la matriz

unset($matriz); // Esto elimina la matriz completa


?>
Nota: Como se menciona anteriormente, si provee los corchetes sin ninguna clave
especificada, entonces se toma el máximo de los índices enteros existentes, y la nueva
clave será ese valor máximo + 1. Si no existen índices enteros aun, la clave será 0
(cero). Si especifica una clave que ya tenía un valor asignado, el valor será reemplazado.

Aviso
A partir de PHP 4.3.0, el comportamiento de generación de índices descrito ha cambiado. Ahora,
si agrega un elemento al final de una matriz en la que la clave máxima actual es negativa, la
siguiente clave creada será cero (0). Anteriormente, el nuevo índice hubiera sido definido como la
mayor clave + 1, al igual que ocurre con los índices positivos.
Note que la clave entera máxima usada para este caso no necesita existir actualmente en
la matriz. Tan solo debe haber existido en la matriz en algún punto desde que la matriz
haya sido re-indexada. El siguiente ejemplo ilustra este caso:
<?php
// Crear una matriz simple.
$matriz = array(1, 2, 3, 4, 5);
print_r($matriz);

// Ahora eliminar cada item, pero dejar la matriz misma intacta:


foreach ($matriz as $i => $valor) {
unset($matriz[$i]);
}
print_r($matriz);

// Agregar un item (note que la nueva clave es 5, en lugar de 0 como


// podria esperarse).
$matriz[] = 6;
print_r($matriz);

// Re-indexar:
$matriz = array_values($matriz);
$matriz[] = 7;
print_r($matriz);
?>
El anterior ejemplo produciría la siguiente salida:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
Array
(
)
Array
(
[5] => 6
)
Array
(
[0] => 6
[1] => 7
)

Funciones útiles

Existe un buen número de funciones útiles para trabajar con matrices. Consulte la sección funciones
de matrices.

Nota: La función unset() le permite remover la definición de claves de una matriz.


Tenga en cuenta que la matriz NO es re-indexada. Si sólo usa "índices enteros comunes"
(comenzando desde cero, incrementando en uno), puede conseguir el efecto de re-
indexación usando array_values().
<?php
$a = array(1 => 'uno', 2 => 'dos', 3 => 'tres');
unset($a[2]);
/* producira una matriz que hubiera sido definida como
$a = array(1 => 'uno', 3 => 'tres');
y NO
$a = array(1 => 'uno', 2 =>'tres');
*/

$b = array_values($a);
// Ahora $b es array(0 => 'uno', 1 =>'tres')
?>
La estructura de control foreach existe específicamente para las matrices. Ésta provee una manera
fácil de recorrer una matriz.

Recomendaciones sobre matrices y cosas a evitar

¿Porqué es incorrecto $foo[bar]?

Siempre deben usarse comillas alrededor de un índice de matriz tipo cadena literal. Por ejemplo, use
$foo['bar'] y no $foo[bar]. ¿Pero qué está mal en $foo[bar]? Es posible que haya visto la siguiente
sintaxis en scripts viejos:

<?php
$foo[bar] = 'enemigo';
echo $foo[bar];
// etc
?>
Esto está mal, pero funciona. Entonces, ¿porqué está mal? La razón es que este código tiene una
constante indefinida (bar) en lugar de una cadena ('bar' - note las comillas), y puede que en el futuro
PHP defina constantes que, desafortunadamente para su código, tengan el mismo nombre. Funciona
porque PHP automáticamente convierte una cadena pura (una cadena sin comillas que no
corresponda con símbolo conocido alguno) en una cadena que contiene la cadena pura. Por ejemplo,
si no se ha definido una constante llamada bar, entonces PHP reemplazará su valor por la cadena
'bar' y usará ésta última.

Nota: Esto no quiere decir que siempre haya que usar comillas en la clave. No querrá
usar comillas con claves que sean constantes o variables, ya que en tal caso PHP no
podrá interpretar sus valores.

<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
ini_set('html_errors', false);
// Matriz simple:
$matriz = array(1, 2);
$conteo = count($matriz);
for ($i = 0; $i < $conteo; $i++) {
echo "\nRevisando $i: \n";
echo "Mal: " . $matriz['$i'] . "\n";
echo "Bien: " . $matriz[$i] . "\n";
echo "Mal: {$matriz['$i']}\n";
echo "Bien: {$matriz[$i]}\n";
}
?>
Nota: La salida del anterior fragmento es:
Revisando 0:
Notice: Undefined index: $i in /path/to/script.html on line 9
Mal:
Bien: 1
Notice: Undefined index: $i in /path/to/script.html on line 11
Mal:
Bien: 1

Revisando 1:
Notice: Undefined index: $i in /path/to/script.html on line 9
Mal:
Bien: 2
Notice: Undefined index: $i in /path/to/script.html on line 11
Mal:
Bien: 2
Más ejemplos para demostrar este hecho:

<?php
// Mostrar todos los errores
error_reporting(E_ALL);

$matriz = array('fruta' => 'manzana', 'vegetal' => 'zanahoria');

// Correcto
print $matriz['fruta']; // manzana
print $matriz['vegetal']; // zanahoria

// Incorrecto. Esto funciona pero tambi&eacute;n genera un error de PHP de


// nivel E_NOTICE ya que no hay definida una constante llamada fruta
//
// Notice: Use of undefined constant fruta - assumed 'fruta' in...
print $matriz[fruta]; // manzana

// Definamos una constante para demostrar lo que pasa. Asignaremos el


// valor 'vegetal' a una constante llamada fruta.
define('fruta', 'vegetal');

// Note la diferencia ahora


print $matriz['fruta']; // manzana
print $matriz[fruta]; // zanahoria

// Lo siguiente esta bien ya que se encuentra al interior de una


// cadena. Las constantes no son procesadas al interior de
// cadenas, asi que no se produce un error E_NOTICE aqui
print "Hola $matriz[fruta]"; // Hola manzana

// Con una excepcion, los corchetes que rodean las matrices al


// interior de cadenas permiten el uso de constantes
print "Hola {$matriz[fruta]}"; // Hola zanahoria
print "Hola {$matriz['fruta']}"; // Hola manzana

// Esto no funciona, resulta en un error de interprete como:


// Parse error: parse error, expecting T_STRING' or T_VARIABLE' or T_NUM_STRING'
// Esto se aplica tambien al uso de autoglobales en cadenas, por supuesto
print "Hola $matriz['fruta']";
print "Hola $_GET['foo']";

// La concatenacion es otra opcion


print "Hola " . $matriz['fruta']; // Hola manzana
?>
Cuando habilita error_reporting() para mostrar errores de nivel E_NOTICE (como por ejemplo
definiendo el valor E_ALL) verá estos errores. Por defecto, error_reporting se encuentra
configurado para no mostrarlos.

Tal y como se indica en la sección de sintaxis, debe existir una expresión entre los corchetes
cuadrados ('[' y ']'). Eso quiere decir que puede escribir cosas como esta:
<?php
echo $matriz[alguna_funcion($bar)];
?>
Este es un ejemplo del uso de un valor devuelto por una función como índice de matriz. PHP
también conoce las constantes, tal y como ha podido apreciar aquellas E_* antes.

<?php
$descripciones_de_error[E_ERROR] = "Un error fatal ha ocurrido";
$descripciones_de_error[E_WARNING] = "PHP produjo una advertencia";
$descripciones_de_error[E_NOTICE] = "Esta es una noticia informal";
?>
Note que E_ERROR es también un identificador válido, asi como bar en el primer ejemplo. Pero el
último ejemplo es ñalente a escribir:

<?php
$descripciones_de_error[1] = "Un error fatal ha ocurrido";
$descripciones_de_error[2] = "PHP produjo una advertencia";
$descripciones_de_error[8] = "Esta es una noticia informal";
?>
ya que E_ERROR es igual a 1, etc.

Tal y como lo hemos explicado en los anteriores ejemplos, $foo[bar] aun funciona pero está mal.
Funciona, porque debido a su sintaxis, se espera que bar sea una expresión constante. Sin embargo,
en este caso no existe una constante con el nombre bar. PHP asume ahora que usted quiso decir bar
literalmente, como la cadena "bar", pero que olvidó escribir las comillas.

¿Entonces porqué está mal?

En algún momento en el futuro, el equipo de PHP puede querer usar otra constante o palabra clave,
o puede que usted introduzca otra constante en su aplicación, y entonces se ve en problemas. Por
ejemplo, en este momento no puede usar las palabras empty y default de esta forma, ya que son
palabras clave reservadas especiales.

Nota: Reiterando, al interior de un valor string entre comillas dobles, es válido no


rodear los índices de matriz con comillas, así que "$foo[bar]" es válido. Consulte los
ejemplos anteriores para más detalles sobre el porqué, asi como la sección sobre
procesamiento de variables en cadenas.

Conversión a matriz

Para cualquiera de los tipos: integer, float, string, boolean y resource, si convierte un valor a un
array, obtiene una matriz con un elemento (con índice 0), el cual es el valor escalar con el que
inició.

Si convierte un object a una matriz, obtiene las propiedades (variables miembro) de ese objeto
como los elementos de la matriz. Las claves son los nombres de las variables miembro.

Si convierte un valor NULL a matriz, obtiene una matriz vacía.


Comparación

Es posible comparar matrices con array_diff() y mediante operadores de matriz.

Ejemplos

El tipo matriz en PHP es bastante versátil, así que aquí se presentan algunos ejemplos que
demuestran el poder completo de las matrices.

<?php
// esto
$a = array( 'color' => 'rojo',
'sabor' => 'dulce',
'forma' => 'redonda',
'nombre' => 'manzana',
4 // la clave sera 0
);

// es completamente ñalente con


$a['color'] = 'rojo';
$a['sabor'] = 'dulce';
$a['forma'] = 'redonda';
$a['nombre'] = 'manzana';
$a[] = 4; // la clave sera 0

$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// resultara en la matriz array(0 => 'a' , 1 => 'b' , 2 => 'c'),
// o simplemente array('a', 'b', 'c')
?>
Ejemplo 11-5. Uso de array()
<?php
// Array como mapa de propiedades
$mapa = array( 'version' => 4,
'SO' => 'Linux',
'idioma => 'ingles',
'etiquetas_cortas' => true
);

// claves estrictamente numericas


$matriz = array( 7,
8,
0,
156,
-10
);
// esto es lo mismo que array(0 => 7, 1 => 8, ...)

$cambios = array( 10, // clave = 0


5 =>
6,
3 =>
7,
'a' =>
4,
11, // clave = 6 (el indice entero maximo era 5)
'8' => 2, // clave = 8 (entero!)
'02' => 77, // clave = '02'
0 => 12 // el valor 10 sera reemplazado por 12
);

// matriz vacia
$vacio = array();
?>
Ejemplo 11-6. Colección
<?php
$colores = array('rojo', 'azul', 'verde', 'amarillo');

foreach ($colores as $color) {


echo "&iquest;Le gusta el $color?\n";
}

?>
Esto producirá la salida:
&iquest;Le gusta el rojo?
&iquest;Le gusta el azul?
&iquest;Le gusta el verde?
&iquest;Le gusta el amarillo?
Note que actualmente no es posible cambiar los valores de la matriz directamente en un ciclo de ese
tipo. Una solución parcial es la siguiente:
Ejemplo 11-7. Colección
<?php
foreach ($colores as $clave => $color) {
// no funciona:
//$color = strtoupper($color);

// funciona:
$colores[$clave] = strtoupper($color);
}
print_r($colores);
?>
Esto genera la salida:
Array
(
[0] => ROJO
[1] => AZUL
[2] => VERDE
[3] => AMARILLO
)
Este ejemplo crea una matriz con base uno.
Ejemplo 11-8. Índice con base 1
<?php
$primercuarto = array(1 => 'Enero', 'Febrero', 'Marzo');
print_r($primercuarto);
?>
Esto imprime:
Array
(
[1] => 'Enero'
[2] => 'Febrero'
[3] => 'Marzo'
)
Ejemplo 11-9. Llenado de una matriz
<?php
// llenar una matriz con todos los items de un directorio
$gestor = opendir('.');
while (false !== ($archivo = readdir($gestor))) {
$archivos[] = $archivo;
}
closedir($gestor);
?>
Las matrices son ordenadas. Puede también cambiar el orden usando varias funciones de
ordenamiento. Vea la sección sobre funciones de matrices para más información. Puede contar el
número de items en una matriz usando la función count().

Ejemplo 11-10. Ordenamiento de una matriz


<?php
sort($archivos);
print_r($archivos);
?>
Dado que el valor de una matriz puede ser cualquier cosa, también puede ser otra matriz. De esta
forma es posible crear matrices recursivas y multi-dimensionales.

Ejemplo 11-11. Matrices recursivas y multi-dimensionales


<?php
$frutas = array ( "frutas" => array ( "a" => "naranja",
"b" => "banano",
"c" => "manzana"
),
"numeros" => array ( 1,
2,
3,
4,
5,
6
),
"hoyos" => array ( "primero",
5 => "segundo",
"tercero"
)
);

// Algunos ejemplos que hacen referencia a los valores de la matriz anterior


echo $frutas["hoyos"][5]; // imprime "segundo"
echo $frutas["frutas"]["a"]; // imprime "naranja"
unset($frutas["hoyos"][0]); // elimina "primero"

// Crear una nueva matriz multi-dimensional


$jugos["manzana"]["verde"] = "bien";
?>
Debe advertir que la asignación de matrices siempre involucra la copia de valores. Necesita usar el
operador de referencia para copiar una matriz por referencia.

<?php
$matriz1 = array(2, 3);
$matriz2 = $matriz1;
$matriz2[] = 4; // $matriz2 cambia,
// $matriz1 sigue siendo array(2, 3)

$matriz3 = &$matriz1;
$matriz3[] = 4; // ahora $matriz1 y $matriz3 son iguales
?>

Objetos
Inicialización de Objetos

Para inicializar un objeto, use la sentencia new, lo que instancia el objeto a una variable.

También podría gustarte