Lección 3: Arrays

Una dimensión

No es posible almacenar más de un valor en una sola variable, a no ser que utilicemos un array.

Un array es un mapa ordenado donde los datos tendrán una clave (key) pero muchos valores (values). Por ejemplo, podríamos guardar los días de la semana bajo el mismo nombre de variable.

$semana = [
    'Lunes',
    'Martes',
    'Miércoles',
    'Jueves',
    'Viernes',
    'Sábado',
    'Domingo'
];

Los valores están dentro de corchetes ([]) separados por comas. De esta formar se asigna automáticamente un marcador que empieza por cero. Si quiero leer por separado cada elemento debo asignar el marcador envuelto en corchetes.

echo $semana[0]; // Lunes
echo $semana[3]; // Jueves
echo $semana[6]; // Domingo

Si quiero ver todo el contenido puedo usar la función nativa de PHP var_dump. Nos dirá la longitud del array, la posición de cada elemento, su tipo, longitud de cada valor y el propio valor que almacena.

var_dump($semana);

/*
array(7) {
  [0] =>
  string(5) "Lunes"
  [1] =>
  string(6) "Martes"
  [2] =>
  string(10) "Miércoles"
  [3] =>
  string(6) "Jueves"
  [4] =>
  string(7) "Viernes"
  [5] =>
  string(7) "Sábado"
  [6] =>
  string(7) "Domingo"
}
*/

var_dump no necesita añadir un echo delante.

Usa var_dump en lugar de print_r, proporciona más información.

Dentro de un array puede existir cualquier tipo, al igual que una variable.

$corteIngles = [
    'Azul',
    39,
    True,
    11
];

Crear

Para declarar un array vacío solamente debemos crear una variable donde asignemos unos corchetes.

$planetas = [];

También lo puedes crear con su función: $planetas = array();.

Añadir

Y para ir añadiendo elementos.

$planetas[] = 'Marte';
$planetas[] = 'Tierra';
$planetas[] = 'Venus';
var_dump($planetas);

/*
array(3) {
  [0] =>
  string(5) "Marte"
  [1] =>
  string(6) "Tierra"
  [2] =>
  string(5) "Venus"
}
*/

Y si queremos utilizar un método más orientado a la programación funcional, podemos usar array_merge para crear un nuevo array.

// Array de partida
$planetas = ['Marte', 'Tierra', 'Venus'];

// Añadimos 'Mercurio'
$nuevosPlanetas = array_merge($planetas, ['Mercurio']);

// Vemos el resultado
var_dump($nuevosPlanetas);

/*
array(4) {
  [0]=>
  string(5) "Marte"
  [1]=>
  string(6) "Tierra"
  [2]=>
  string(5) "Venus"
  [3]=>
  string(8) "Mercurio"
}
*/

Una utilidad muy práctica para saber la longitud de un array es usar la funcion count().

echo count($planetas);
// 3

Modificar

Para cambiar un valor hay que indicar la posición y el nuevo valor a introducir. ¿Recuerdas que el símbolo = es en realidad ?

$planetas[2] = 'Saturno';

Borrar

Eliminar un elemento es un poco más marciano, debes usar una función nativa llamada unset. Personalmente creo que ha sido creada por un ser malvado. Me explico.

Supongamos que quiero destruir la Tierra antes de que lo haga el hombre. Es el 2º elemento, cuya posición es la 1.

unset($planetas[1]);

Veamos que ha pasado.

var_dump($planetas);
/*
array(2) {
  [0] =>
  string(5) "Marte"
  [2] =>
  string(5) "Venus"
}
*/

Se ha ido… pero ¡me ha desordenado las posiciones! Intentamos hacer un Ctrl+Z añadiendo la Tierra de nuevo.

// Añado
$planetas[] = 'Tierra';
// Muestro todo
var_dump($planetas);
/*
array(2) {
  [0] =>
  string(5) "Marte"
  [2] =>
  string(5) "Venus"
  [3] =>
  string(6) "Tierra"
}
*/

Como dijo Jack Swigert en el Apolo 13: “-Houston, tenemos un problema-“. Nuestro array pierde la posición que borramos para siempre. En realidad no es un problema porque la gran mayoría de las ocasiones lo recorreremos con un bucle (loop) e ignoraremos las posiciones, pero debes ser consciente de como funciona para no encontrarte sorpresas.

No obstante siempre puedes ignorar mis palabras y ordenarlo creando un nuevo array con un loop malgastando recursos.

// Elimino la Tierra
unset($planetas[1]);
// Declaro mi nuevo array
$planetasSinTierra = [];
// Lo asigno elemento por elemento
foreach ($planetas as $posicion => $nombre) {
    $planetasSinTierra[] = $nombre;
}

Jugando con Strings

Observa y dime que ocurre.

$palabra = 'abcdef';
echo $palabra[2];
// c

¿Qué ha pasado? Pues que los string pueden ser manipulados igual que un array.

$palabra = 'abcdef';
$palabra[2] = 'Z';
echo $palabra;
// abZdef

Un string se comporta como un array porque en el fondo no existen las palabras en la programación, sino conjuntos de carácteres. Dicho de otra manera: un string es un array de muchas letras.

Convertir un String en un Array

En algún momento tendrás la necesidad de pasar un texto a un array por medio de algún separador. Por ejemplo, transformar una frase a array dividido por espacios. Te dejo un ejemplo para realizarlo. El secreto esta en usar preg_split.

$frase = 'En un lugar de la mancha';
$arrayDeFrase = preg_split('/[\s,]+/', $frase);
echo $arrayDeFrase[2];
// "lugar"
var_dump($arrayDeFrase);
/*
array(6) {
  [0] =>
  string(2) "En"
  [1] =>
  string(2) "un"
  [2] =>
  string(5) "lugar"
  [3] =>
  string(2) "de"
  [4] =>
  string(2) "la"
  [5] =>
  string(6) "mancha"
}
*/

No uses split(), la función esta OBSOLETA desde la versión 5.3.0. y ha sido ELIMINADA en la versión 7.0.0.

Diccionario

Las claves (key) pueden ser definidas por nosotros. A esto se le denomina diccionario.

$empleados = [
    'Juan' => 34,
    'Luisa' => 56
];

Para leer será de la misma forma, salvo que ya no tenemos posiciones sino nuestras propias claves.

echo $empleados['Luisa'];

A la hora de añadir tendrás que indicar directamente el nombre que quieras darle.

$empleados = [];
$empleados['Manolo'] = 99;
var_dump($empleados);
/*
array(1) {
  'Manolo' =>
  int(99)
}
*/

Modificar será igual, indicando la clave.

$empleados['Manolo'] = 11;
var_dump($empleados);
/*
array(1) {
  'Manolo' =>
  int(11)
}
*/

Y borrar de la misma forma que un array.

$empleados = [];
$empleados['Manolo'] = 99;
$empleados['Juan'] = 99;
var_dump($empleados);
/*
array(2) {
  'Manolo' =>
  int(99)
  'Juan' =>
  int(99)
}
*/
unset($empleados['Manolo']);
var_dump($empleados);
/*
array(1) {
  'Juan' =>
  int(99)
}
*/

Dos dimensiones

Al principio de la lección dije que se podía añadir dentro de un array cualquier elemento, incluso… podríamos rizar el rizo insertando… ¡Otro array! A esto se le llama array de dos dimensiones, cuando un array tiene dentro otro array.

$rizo = [
    []
]
var_dump($rizo);
/*
array(1) {
  [0] =>
  array(0) {
  }
}
*/

Tiene infinidad de usos. Pensemos que has heredado de un tio rico una tienda de ropa. Cada producto tiene su propio código de barras, precio, nombre, color y género.

$zara = [
    123 => [
      'nombre' => 'Camisa a cuadros',
      'precio' => 29.95,
      'sexo' => 'Hombre'
    ],
    234 => [
      'nombre' => 'Falda manga',
      'precio' => 19.95,
      'sexo' => 'Mujer'
    ],
    345 => [
      'nombre' => 'Bolso minúsculo',
      'precio' => 50,
      'sexo' => 'Mujer'
    ]
];
var_dump($zara);
/*
array(3) {
  [123] =>
  array(3) {
    'nombre' =>
    string(16) "Camisa a cuadros"
    'precio' =>
    double(29.95)
    'sexo' =>
    string(6) "Hombre"
  }
  [234] =>
  array(3) {
    'nombre' =>
    string(11) "Falda manga"
    'precio' =>
    double(19.95)
    'sexo' =>
    string(5) "Mujer"
  }
  [345] =>
  array(3) {
    'nombre' =>
    string(16) "Bolso minúsculo"
    'precio' =>
    int(50)
    'sexo' =>
    string(5) "Mujer"
  }
}

*/

El mecanismo para gestionarlo es igual al diccionario salvo que debemos ir nodo por nodo.

echo $zara[345]['nombre'];
// Bolso minúsculo
Actividad 1
  • Guarda en un array tus 6 películas favoritas.
  • Imprime en párrafos con el siguiente formato: 'Película: Los Vengadores'
  • Añade la posición de la película: 'Película 4: Godzilla'

Pro:

  • Imprime en lugar de párrafos... ¡una tabla!
  • Añade un poco de CSS para mejorar el diseño. Cada título debe tener un color aleatorio. ¡Pista!: random_int(0, 255)
Actividad 2
  • Imprime los números del 1 al 10.
  • Imprime los números de 60 al 70.
  • Imprime los números del 20 al 1.
  • Imprime los números del 1 al 1000
  • Imprime la tabla del 5.

Pro:

  • Imprime la tabla del 5 con este formato: 5 x 3 = 15
  • Suma los números del 1 al 100.
Actividad 3

Supongo que el ejemplo anterior esta claro y no tienes dudas. ¡Demuéstramelo!

  • ¿Cuantas veces se ejecuta el primer foreach?
  • ¿Cuantas veces se ejecuta el segundo foreach?
  • ¿Cuantos echos se han realizado? ¿Corresponde a las respuestas anteriores?
  • En el ejemplo tienes 2 loops anidados. ¿Cuantos piensas que pueden existir como máximo (un bucle dentro de un bucle de otro bucle...)?
Actividad 4
  • Crea un select para pedir el dia de nacimiento: 1 al 31. Usa un foreach.
  • A su otro lado select para pedir el mes de nacimiento: 1 al 12. Usa un for.
  • Y a continuación otro select para pedir el año de nacimiento: 1900 al año actual. Usa un while.

Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivadas 4.0 Internacional.

Atribución/Reconocimiento-NoComercial-SinDerivados 4.0 Internacional

¿Me invitas a un café? ☕

Puedes hacerlo usando el terminal.

ssh customer@andros.dev -p 5555

Comentarios

{{ comments.length }} comentarios

Nuevo comentario

Nueva replica  {{ formatEllipsisAuthor(replyComment.author) }}

Acepto la política de Protección de Datos.

Escribe el primer comentario