Funciones de matrices

En esta lección se comentan varias funciones útiles para trabajar con matrices. La información general sobre matrices en PHP se encuentra en la lección Matrices.

Generar valores numéricos en sucesión aritmética

La función range($inicio, $final, $paso) genera una matriz de valores en sucesión aritmética, es decir los valores desde $inicio hasta $final contando de $paso en $paso (sin superar el valor $final).

Nota: A diferencia del tipo range() de Python, el valor $final de la sucesión se incluye en su caso en el resultado.

<?php
$valores = range(1, 10, 3);

print "<pre>\n"; print_r($valores); print "</pre>\n";
?>
Array
(
    [0] => 1
    [1] => 4
    [2] => 7
    [3] => 10
)
<?php
$valores = range(0.5, 1.5, 0.4);

print "<pre>\n"; print_r($valores); print "</pre>\n";
?>
Array
(
    [0] => 0.5
    [1] => 0.9
    [2] => 1.3
)

Mezclar matrices

La función array_merge($matriz_1, $matriz_2, ...) mezcla dos o más matrices en una única matriz.

Si los índices son numéricos, al mezclar las matrices se conservan todos los valores y se renumeran los índices.

<?php
$uno = [1, 2, 4];
$dos = [1, 3, 9];

$final = array_merge($uno, $dos);

print "<pre>\n"; print_r($final); print "</pre>\n";
?>
Array
(
    [0] => 1
    [1] => 2
    [2] => 4
    [3] => 1
    [4] => 3
    [5] => 9
)
<?php
$uno = [1 => 1, 2 => 2, 3 => 4];
$dos = [1 => 1, 2 => 3, 3 => 9];

$final = array_merge($uno, $dos);

print "<pre>\n"; print_r($final); print "</pre>\n";
?>
Array
(
    [0] => 1
    [1] => 2
    [2] => 4
    [3] => 1
    [4] => 3
    [5] => 9
)

Pero si los índices no son numéricos, al mezclar las matrices los valores se sobreescriben.

<?php
$uno = ["a" => 1, "b" => 2, "c" => 4];
$dos = ["a" => 2, "b" => 4, "c" => 6];

$final = array_merge($uno, $dos);

print "<pre>\n"; print_r($final); print "</pre>\n";
?>
Array
(
    [a] => 2
    [b] => 4
    [c] => 6
)

Si hay índices numéricos e índices no numéricos, al mezclar las matrices los valores de índices numéricos se conservan, pero los no numéricos se sobreescriben.

<?php
$uno = [1 => 1, "b" => 2, "c" => 4];
$dos = [1 => 100, "b" => 4, "c" => 6];

$final = array_merge($uno, $dos);

print "<pre>\n"; print_r($final); print "</pre>\n";
?>
Array
(
    [0] => 1
    [b] => 4
    [c] => 6
    [1] => 100
)

Contar elementos de una matriz

La función count($matriz) permite contar los elementos de una matriz.

<?php
$nombres[1] = "Ana";
$nombres[10] = "Bernardo";
$nombres[25] = "Carmen";

$elementos = count($nombres);

print "<p>La matriz tiene $elementos elementos.</p>\n";
print "\n";
print "<pre>\n"; print_r($nombres); print "</pre>\n";
?>

La matriz tiene 3 elementos.

Array
(
    [1] => Ana
    [10] => Bernardo
    [25] => Carmen
)

En una matriz multidimensional, la función count($matriz) considera la matriz como un vector de vectores y devuelve simplemente el número de elementos del primer índice:

<?php
$datos["pepe"]["edad"] = 25;
$datos["pepe"]["peso"] = 80;
$datos["juan"]["edad"] = 22;
$datos["juan"]["peso"] = 75;
$datos["ana"]["edad"]  = 30;

$elementos = count($datos);

print "<p>La matriz tiene $elementos elementos.</p>\n";
print "\n";
print "<pre>\n"; print_r($datos); print "</pre>\n";
?>

La matriz tiene 3 elementos.

Array
(
    [pepe] => Array
        (
            [edad] => 25
            [peso] => 80
        )

    [juan] => Array
        (
            [edad] => 22
            [peso] => 75
        )

    [ana] => Array
        (
            [edad] => 30
        )

)

Para contar todos los elementos de una matriz multidimensional, habría que utilizar la función count($matriz, COUNT_RECURSIVE).

<?php
$datos["pepe"]["edad"] = 25;
$datos["pepe"]["peso"] = 80;
$datos["juan"]["edad"] = 22;
$datos["juan"]["peso"] = 75;
$datos["ana"]["edad"]  = 30;

$elementos = count($datos, COUNT_RECURSIVE);

print "<p>La matriz tiene $elementos elementos.</p>\n";
print "\n";
print "<pre>\n"; print_r($datos); print "</pre>\n";
?>

La matriz tiene 8 elementos.

Array
(
    [pepe] => Array
        (
            [edad] => 25
            [peso] => 80
        )

    [juan] => Array
        (
            [edad] => 22
            [peso] => 75
        )

    [ana] => Array
        (
            [edad] => 30
        )

)

En el ejemplo anterior, la respuesta 8 se debe a que la función count()recursiva considera la matriz como un vector de vectores y cuenta los elementos que hay en cada nivel. Desde ese punto de vista, la matriz contiene tres elementos que a su vez contienen dos, dos y un elementos, lo que da un total de ocho elementos.

Si quisiéramos contar únicamente los elementos de una matriz bidimensional habría que restar los dos resultados anteriores (5 = 8 - 3):

<?php
$datos["pepe"]["edad"] = 25;
$datos["pepe"]["peso"] = 80;
$datos["juan"]["edad"] = 22;
$datos["juan"]["peso"] = 75;
$datos["ana"]["edad"]  = 30;

$elementos = count($datos, COUNT_RECURSIVE) - count($datos);

print "<p>La matriz tiene $elementos elementos.</p>\n";
print "\n";
print "<pre>\n"; print_r($datos); print "</pre>\n";
?>

La matriz tiene 5 elementos.

Array
(
    [pepe] => Array
        (
            [edad] => 25
            [peso] => 80
        )

    [juan] => Array
        (
            [edad] => 22
            [peso] => 75
        )

    [ana] => Array
        (
            [edad] => 30
        )

)

Contar cuántas veces aparece cada valor en una matriz

La función array_count_values($matriz) cuenta cuántos valores hay de cada valor de una matriz.

La matriz devuelta tiene como índices los valores de la matriz original y como valores la cantidad de veces que aparece el valor.

<?php
$nombres = ["Ana", "Bernardo", "Bernardo", "Ana", "Carmen", "Ana"];

$cuenta = array_count_values($nombres);

print "<pre>\n"; print_r($cuenta); print "</pre>\n";
?>

La matriz tiene 3 elementos.

Array
(
    [Ana] => 3
    [Bernardo] => 2
    [Carmen] => 1
)

Máximo y mínimo

La función max($matriz, ...) devuelve el valor máximo de una matriz (o varias). La función min($matriz, ...) devuelve el valor mínimo de una matriz (o varias).

<?php
$numeros = [10, 40, 15, -1];

$maximo = max($numeros);
$minimo = min($numeros);

print "<pre>"; print_r($numeros); print "</pre>\n";
print "\n";
print "<p>El máximo de la matriz es $maximo.</p>\n";
print "\n";
print "<p>El mínimo de la matriz es $minimo.</p>\n";
?>
Array
(
    [0] => 10
    [1] => 40
    [2] => 15
    [3] => -1
)

El máximo de la matriz es 40.

El mínimo de la matriz es -1.

Los valores no numéricos se tratan como 0, pero si 0 es el mínimo o el máximo, la función devuelve la cadena.

<?php
$valores = [10, 40, 15, "abc"];

$maximo = max($valores);
$minimo = min($valores);

print "<pre>\n"; print_r($valores); print "</pre>\n";
print "\n";
print "<p>El máximo de la matriz es $maximo.</p>\n";
print "\n";
print "<p>El mínimo de la matriz es $minimo.</p>\n";
?>
Array
(
    [0] => 10
    [1] => 40
    [2] => 15
    [3] => abc
)

El máximo de la matriz es 40.

El mínimo de la matriz es abc.

Ordenar una matriz

Existen varias funciones para ordenar matrices. Las más simples son las siguientes:

Para ver la diferencia entre estas funciones, la tabla siguiente resume los ejemplos anteriores:

Matriz inicial sort() rsort() asort() arsort() ksort() krsort()
Array
(
    [5] => cinco
    [1] => uno
    [9] => nueve
)
Array
(
    [0] => cinco
    [1] => nueve
    [2] => uno
)
Array
(
    [0] => uno
    [1] => nueve
    [2] => cinco
)
Array
(
    [5] => cinco
    [9] => nueve
    [1] => uno
)
Array
(
    [1] => uno
    [9] => nueve
    [5] => cinco
)
Array
(
    [1] => uno
    [5] => cinco
    [9] => nueve
)
Array
(
    [9] => nueve
    [5] => cinco
    [1] => uno
)

Buscar un valor en una matriz

La función booleana in_array($valor, $matriz[, $tipo]) devuelve true si el valor se encuentra en la matriz. Si el argumento booleano $tipo es true, in_array() comprueba además que los tipos coincidan.

<?php
$valores = [10, 40, 15, -1];

print "<pre>\n"; print_r($valores); print "</pre>\n";

if (in_array(15, $valores)) {
  print "<p>15 está en la matriz \$valores.</p>\n";
} else {
  print "<p>15 no está en la matriz \$valores.</p>\n";
}
print "\n";

if (in_array(25, $valores)) {
  print "<p>25 está en la matriz \$valores.</p>\n";
} else {
  print "<p>25 no está en la matriz \$valores.</p>\n";
}
print "\n";

if (in_array("15", $valores, true)) {
  print "<p>\"15\" está en la matriz \$valores.</p>\n";
} else {
  print "<p>\"15\" no está en la matriz \$valores.</p>\n";
}
?>
Array
(
    [0] => 10
    [1] => 40
    [2] => 15
    [3] => -1
)

15 está en la matriz $valores.

25 no está en la matriz $valores.

"15" no está en la matriz $valores.

La función array_search($valor, $matriz[, $tipo]) busca el valor en la matriz y, si lo encuentra, devuelve el índice correspondiente, pero si hay varios valores coincidente sólo devuelve el primero que encuentra.

La función array_keys($matriz[, $valor[, $tipo]) busca el valor en la matriz y, si lo encuentra, devuelve una matriz cuyos valores son los índices de todos los elementos coincidentes.

<?php
$valores = [10, 40, 15, 30, 15, 40, 15];

print "<pre>\n"; print_r($valores); print "</pre>\n";
print "\n";

$encontrado = array_search(15, $valores);
print "<p>$encontrado</p>\n";
print "\n";

$encontrados = array_keys($valores, 15);
print "<pre>\n"; print_r($encontrados); print "</pre>\n";
?>
Array
(
    [0] => 10
    [1] => 40
    [2] => 15
    [3] => 30
    [4] => 15
    [5] => 40
    [6] => 15
)

2

Array
(
    [0] => 2
    [1] => 4
    [2] => 6
)

Reindexar una matriz

La función array_values($matriz) devuelve los valores de una matriz en el mismo orden que en la matriz original, pero renumerando los índices desde cero

<?php
$nombres = ["a" => "Ana", "b" => "Bernardo", "c" => "Carmen", "d" => "David"];

print "<p>Matriz inicial:</p>\n";
print "\n";
print "<pre>\n"; print_r($nombres); print "</pre>\n";
print "\n";

$reindexada = array_values($nombres);

print "<p>Matriz reindexada con array_values():</p>\n";
print "\n";
print "<pre>\n"; print_r($reindexada); print "</pre>\n";
print "\n";
?>

Matriz inicial:

Array
(
    [a] => Ana
    [b] => Bernardo
    [c] => Carmen
    [d] => David
)

Matriz reindexada con array_values():

Array
(
    [0] => Ana
    [1] => Bernardo
    [2] => Carmen
    [3] => David
)

Barajar los elementos de una matriz

La función shuffle($matriz) baraja los valores de una matriz. Los índices de la matriz original se pierden, ya que se renumeran desde cero.

<?php
$numeros = [0, 1, 2, 3, 4, 5];

print "<p>Matriz inicial:</p>\n";
print "\n";
print "<pre>\n"; print_r($numeros); print "</pre>\n";
print "\n";

shuffle($numeros);

print "<p>Matriz barajada con shuffle():</p>\n";
print "\n";
print "<pre>\n"; print_r($numeros); print "</pre>\n";
print "\n";
?>

Matriz inicial:

Array
(
    [0] => 0
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 4
    [5] => 5
)

Matriz barajada con shuffle():

Array
(
    [0] => 3
    [1] => 1
    [2] => 5
    [3] => 0
    [4] => 4
    [5] => 2
)
<?php
$numeros = ["a" => 1, "b" => 2, "c" => 3, "d" => 4];

print "<p>Matriz inicial:</p>\n";
print "\n";
print "<pre>\n"; print_r($numeros); print "</pre>\n";
print "\n";

shuffle($numeros);

print "<p>Matriz barajada con shuffle():</p>\n";
print "\n";
print "<pre>\n"; print_r($numeros); print "</pre>\n";
print "\n";
?>

Matriz inicial:

Array
(
    [a] => 1
    [b] => 2
    [c] => 3
    [d] => 4
)

Matriz barajada con shuffle():

Array
(
    [0] => 2
    [1] => 1
    [2] => 4
    [3] => 3
)

Extraer al azar un elemento de una matriz

La función array_rand($matriz) extrae al azar uno de los índices de la matriz.

<?php
$cuadrados = [2 => 4, 3 => 9, 7 => 49, 10 => 100];

$indice = array_rand($cuadrados);

print "<p>$indice</p>\n";
?>
<p>10</p>

Una vez obtenido el índice se puede obtener el valor correspondiente de la matriz.

<?php
$cuadrados = [2 => 4, 3 => 9, 7 => 49, 10 => 100];

$indice = array_rand($cuadrados);

print "<p>$indice - $cuadrados[$indice]</p>\n";
?>
<p>10 - 100</p>

Eliminar valores repetidos

La función array_unique($matriz) devuelve una matriz en la que se han eliminado los valores repetidos.

<?php
$inicial = [0, 0, 1, 3, 1, 3, 2, 1];

$final = array_unique($inicial);

print "<pre>\n"; print_r($final); print "</pre>\n";
?>
Array
(
    [0] => 0
    [2] => 1
    [3] => 3
    [6] => 2
)