Certificación Zend PHP 5.3 (III) – Arrays (I)

Retomamos los posts sobre la certificación Zend tras el parón navideño y esta vez vamos a tratar uno de los núcleos de la programación en PHP: los arrays.

Probablemente muchos domináis (o creéis que domináis, jejeje) este tema, pero a ver si podemos aprender alguna cosilla. Y en la parte de los sort, introduciremos una de las cosas que más me gustan de PHP5.3, los closures.

Los arrays en PHP son algo diferentes a otros lenguajes de programación, y no hay que confundirlos con los vectores tradicionales de C o otros lenguajes.
Básicamente son estructuras de tipo clave => valor (donde valor puede ser a su vez otro array) y donde las claves no tienen por qué ir en orden, y pueden ser numéricas o alfanuméricas. Además, dentro de un array podemos tener mezclados diferentes tipos de datos, a diferencia de los vectores o estructuras similares de otros lenguajes.

Para declarar un array y asignarle valores tenemos varias posibilidades:

<?php
    // Esto es un array vacío
    $arVacio = array();
 
    // Array para almacenar secuencias de valores de distinto tipo
    $arAlmacenar = array(10, 'A', 30.5);
 
    // Array definiendo claves numéricas y valores diversos
    $arClavesNumericas = array(1 => 2, 3 => 'a', 5 => 12.8);
 
    // Array claves alfanuméricas junto con numéricas
    $arClavesAlfanumericas = array('uno' => 2, 'dos' => 'a', 3 => 12.8);
 
    // Array que se va acumulando (útil en un bucle)
    for($i=0; $i < 3; $i++)
    {
       $arAcumulado[] = $i;
    }    
 
   // Array multidimensional
   $arMulti = array(1, array(2, 3 , array(2, 7, array(8, 9))));
?>

Todo esto parece muy fácil pero me gustaría remarcar:

– En un array pueden convivir perfectamente diferentes tipos de datos.
– A diferencia de otros lenguajes, pueden existir “saltos” en las claves numéricas, como vemos en $arClavesNumericas
– Pueden convivir claves numéricas y alfanuméricas
– Podemos construir arrays “bajo demanda”, como vemos el caso del bucle, donde acabaríamos teniendo la estructura array(0=>0, 1=>1,2=>2)
– Podemos montar estructuras complejas como el último caso

Todo esto está muy bien y parece muy fácil, pero en la certificación son muy malignos y nos ponen casos como el siguiente:

What will the following script output?

<?php
$array = array (0.1 => 'a', 0.2 => 'b');
echo count ($array);
?>

Y te quedas con cara de… yo nunca he hecho esto… ¿se puede? ¿se convierten? ¿peta? Podéis ver la respuesta en spoiler.

Spoiler
La respuesta es 1. Y PHP hace lo siguiente: solamente están permitidas claves con números enteros (tanto positivos como negativos) y strings. Si llega otro tipo, lo intenta convertir… y en este caso convierte los float a int. Resumiendo, es como si se creara la key 0 con valor ‘a’ y luego la machacamos con el valor b.

O como esto…

What will the following script output?

<?php
$array = array (true => 'a', 1 => 'b');
var_dump ($aray);
?>

Y decimos… vale esta me la sé… o no nos la sabemos?

Spoiler
Normalmente, si hemos estudiado, contestaremos que queda array(1=>’b’)…. PEROOOOOO fijaros que pone var_dump($aray) y no var_dump($array). Por tanto la respuesta es que dará un notice (si tenemos ese error_reporting activo) y veremos NULL.
Mucho cuidadito con estas cosas que siempre cae alguna!!!!

Implode / explode vs serialize / unserialize

Otras funciones indispensables de los arrays son implode y explode para pasar un array a string y viceversa.
Muchas veces nos puede interesar pasar arrays a strings para almacenarlos en una cookie o en base de datos, pero ojo que con estas funciones perdemos las claves originales del array.

La única manera de pasar un array a string y después recuperarlo con sus claves es usando serialize o unserialize.

<?php
$arClaves = array(1=>2, 'a'=>'b');
$arString1 = implode(' ', $arClaves);
$arClaves2 = explode(' ', $arString1);
// El array tiene bien los valores, pero se han perdido las claves!!!
var_dump($arClaves2);
 
$arString2 = serialize($arClaves);
$arClaves2 = unserialize($arString2);
// Ahora queda bien!
var_dump($arClaves2);
 
?>

Bueno, por hoy lo dejamos aquí, en próximos días un nuevo post continuando con arrays y algo de closures.

You may also like...