Iteración de arrays en PHP

Formas de recorrer arrays en PHP utilizando estructuras de control y funciones específicas de arrays

Contenido modificable

Si ves errores o quieres modificar/añadir contenidos, puedes crear un pull request. Gracias

Los arrays nos permiten almacenar datos de forma que después sea más fácil añadirlos, eliminarlos, modificarlos o mostrarlos. La iteración de arrays consiste en recorrer arrays, es decir, aplicar una acción a cada elemento de un array uno por uno, ya sea a su key, a su value o a ambos. Esta acción puede ser mostrar en un listado el array, extraer o modificar ciertos elementos bajo alguna condición, aplicar funciones a los elementos del array, etc.

Índice de contenido

  1. Formas de recorrer arrays
Funciones para recorrer arrays
2. array_walk 5. array_keys
3. array_key_exists 6. array_values
4. in_array

1. Formas de recorrer arrays

Los tres métodos siguientes nos permiten recorrer arrays para poder manipular las claves y los valores de un array:

  • Utilizando la estructura de control for
<?php
$array = array('perro', 'gato', 'avestruz');
$array_num = count($array);
for ($i = 0; $i < $array_num; ++$i){
    print $array[$i];
}

Este método no debe emplearse por varios motivos:

  • Te limita a arrays numéricos.
  • Los keys pueden estar desordenados.
  • Puede faltar algún key, por lo que genera un error del tipo Undefined offset.
  • Utilizando la estructura de control foreach
<?php
foreach ($array as $val) {
    print $val;
}

Este método es mucho más rápido y fácil de utilizar. En este ejemplo $val es el valor de cada key que pasa por la iteración, por lo que las keys quedan ignoradas.

Para extraer también las keys:

<?php
foreach($array as $key => $val) {
    print "$key = $val <br>";
}

En este caso también podemos utilizar las keys, especialmente útil cuando son arrays asociativos.

  • Utilizando la estructura de control while

Este método utiliza también las funciones list() y each():

<?php
reset($array);
while(list($var, $val) = each($array)) {
    print "$var is $val <br>";
}

La función list() parte de un array para convertirlo en variables individuales.

each() devuelve un array del elemento en el que está situado el cursor del array que queremos iterar (el cursor del array hace referencia al elemento del array que está siendo evaluado). El array devuelto está formado por 4 keys: [0], [1], [key], [value]. 0 y key contienen el nombre de la key del elemento actual, y 1 y value contienen su valor. Supongamos un array de sólo un elemento:

<?php
$array = array('animal'=>'perro');
var_dump(each($array)); /*
Devuelve un array de 4 elementos:
'1' => perro,
'value' => perro,
'0' => animal,
'key' => animal
*/

each(), además de leer el elemento actual, pasa el cursor al siguiente elemento del array. Todos los arrays tienen un cursor que puedes ir moviendo según las necesidades. Para garantizar que el array comienza con el cursor en el principio, se puede utilizar reset($array) (esto no es necesario con foreach() ya que siempre empieza desde el principio). Mientras se vaya asignando cada variable de list() a cada elemento del array, el cursor irá pasando de elemento en elemento hasta que finalice el array. list() sólo coge los elementos de array numérico, es por ello que del array que devuelve each(), coge el 0 y el 1, y no el key y el value.

A partir de PHP 5.5 es posible utilizar list() con foreach():

<?php
$users = array(
    array('John', 'West'),
    array('Peter', 'Parker'),
    array('Ann', 'Jolie')
);
// Esto:
foreach ($users as $user){
    list($nombre, $apellido) = $user;
    echo "Usuario: $nombre $apellido <br>";
}
// Devuelve lo mismo que esto:
foreach ($users as list($nombre, $apellido))
{
    echo "Usuario: $nombre $apellido <br>";
}

¿Qué método utilizar?

Normalmente se utiliza foreach porque es más legible y está más optimizado, pero while también se utiliza con frecuencia. Pueden utilizarse los dos, la principal diferencia es que foreach siempre empieza desde el principio.

El método que no se recomienda es el método con for, por los motivos que ya se han explicado.

Funciones para recorrer arrays

Funciones que son utilizadas con frecuencia en la iteración de arrays.

2. array_walk

bool array_walk (array &$array, callable $callback [, mixed $userdata = null ])

Aplica una función definida por el usuario dada por $callback a cada elemento del array dado por $array.

A _arraywalk() no le afecta la posición del puntero, recorrerá el array entero sin tenerlo en cuenta.

El callback asume dos parámetros $callback ($value, $key). El primero es el value del elemento del array siendo recorrido y el segundo su key. Sólo se pueden cambiar los valores del array, no se puede alterar su estructura: ni añadir, ni eliminar ni reordenar elementos.

El parámetro opcional $userdata se puede pasar como tercer parámetro de la función dada por $callback.

Devuelve true en caso de éxito o false en caso de error. Si $callback requiere más parámetros de los proporcionados se genera un E_WARNING cada vez que _arraywalk llame a callback.

$animales = array(
    "perro" => "Pooh",
    "gato" => "Smiles",
    "avestruz" => "Spunky",
    "conejo" => "Sugar"
);
function cambiarNombre(&$nombre, $animal){
    // Añade Nombre : en cada valor del array
    $nombre = "Nombre: " . $nombre;
}
function mostrarMascotas($nombre, $animal){
    echo strtoupper($animal) . " -> $nombre" . "<br>";
}
// Muestra el listado del array:
array_walk($animales, 'mostrarMascotas');
// Modifica cada value para añadir Nombre: al principio
array_walk($animales, 'cambiarNombre');
// Ahora el listado mostrado incluye Nombre:
array_walk($animales, 'mostrarMascotas');

3. array_key_exists

bool array_key_exists (mixed $key, array $array)

Comprueba que el key existe en el array. Devuelve true si existe o false si da error.

$animales = array ("perro" => "Bruce", "gato" => "Schmeichel");
if(array_key_exists('perro', $animales)){
    echo "Tengo un perro";
}

_array_keyexists() retorna true también si un key tiene un valor null. isset() no lo hace.

También devuelve true si el key es una propiedad definida dentro de un objeto dado como array.

4. in_array

bool in_array (mixed $needle, array $haystack [, bool $strict = FALSE ])

Comprueba si un valor existe en un array. Busca $needle en el array $haystack.

Si $strict es true, la función también comprobará los tipos de $needle en $haystack.

Es sensible a mayúsculas y minúsculas.

$animales = array ("perro", "gato", "Oso");
// Muestra tengo un perro:
if(in_array("perro", $animales)){
    echo "Tengo un perro";
}
// No muestra tengo un oso, porque es un Oso el que tengo:
if(in_array("oso", $animales)){
    echo "Tengo un oso";
}
// Ejemplo con modo estricto
$numeros = array(5, "10", 20, "40");
// Muestra Tengo un 10 como string
if(in_array('10', $numeros, true)){
    echo "Tengo un 10 como string";
}
// NO lo muestra porque el 10 de $numeros es un string
if(in_array(10, $numeros, true)){
    echo "Tengo un 10 como integer";
}

5. array_keys

array array_keys (array $array [, mixed $search_value [, bool $strict = false ]] )

Devuelve un array con todas las claves de un array o un subconjunto de claves de un array.

Si se especifica _$searchvalue sólo se devuelven las keys para ese valor.

$strict determina si ha de usarse una comparación estricta === o no.

$animales = array (
    "perro" => "Stoichkov",
    "gato" => "Sunny",
    "conejo" => "Tarzan"
);
print_r(array_keys($animales));
/*
 Devuelve:
Array
(
    [0] => perro
    [1] => gato
    [2] => conejo
)
 */
print_r(array_keys($animales, "Sunny"));
/*
 Devuelve
Array
(
    [0] => gato
)
 */

6. array_values

array array_values (array $array)

Devuelve todos los valores de un array y los indexa numéricamente.

$animales = array (
    "perro" => "Stoichkov",
    "gato" => "Sunny",
    "conejo" => "Tarzan"
);
print_r(array_values($animales));
/*
 Devuelve:
Array
(
    [0] => Stoichkov
    [1] => Sunny
    [2] => Tarzan
)
 */