2022-04-28

Muy buena nota sobre los array en PHP, encontra cosas que no sabía.

 

Los basicos

Hay dos formas diferentes de crear matrices. Uno es para  array() especificar los elementos como pares clave-valor. El otro método es poner todos los elementos dentro  []Hay dos puntos importantes que debe recordar al crear matrices asociadas con pares de claves.

Primero, la clave siempre tiene que ser única. Si intenta usar la misma clave varias veces en una matriz, PHP ignorará todos los demás pares clave-valor excepto el último. En segundo lugar, si una clave se crea como flotantes, booleanos y representaciones de cadenas válidas de enteros, se convertirá en enteros.

Aquí hay algunos ejemplos de creación de matrices en PHP:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
dieciséis
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$first = array(10, "Apple", 20, -18, "Monkey");
print_r($first);
/* Array
(
    [0] => 10
    [1] => Apple
    [2] => 20
    [3] => -18
    [4] => Monkey
) */
 
$second = [10, "Apple", 20, -18, "Monkey"];
print_r($second);
/* Array
(
    [0] => 10
    [1] => Apple
    [2] => 20
    [3] => -18
    [4] => Monkey
) */
 
$third = [10, 5 => "Apple", 2 => 20, -18, "Monkey"];
print_r($third);
/* Array
(
    [0] => 10
    [5] => Apple
    [2] => 20
    [6] => -18
    [7] => Monkey
) */

Como puede ver, usar array() o  []es equivalente al crear matrices. La notación abreviada ha estado disponible a partir de PHP 5.4.

Tampoco necesita especificar una clave para cada valor de matriz. Cuando se omite, PHP establece la clave en uno más que la clave entera especificada más grande. Todas las claves asignadas automáticamente serán mayores o iguales a 0.

Trabajar con claves y valores

Comencemos con las funciones básicas que funcionan con claves de matriz y valores. Uno de ellos es  array_combine(), que crea una matriz utilizando una matriz para claves y otra para sus valores:

01
02
03
04
05
06
07
08
09
10
11
12
$keys = ['sky', 'grass', 'orange'];
$values = ['blue', 'green', 'orange'];
 
$array = array_combine($keys, $values);
print_r($array);
 
// Array
// (
//     [sky] => blue
//     [grass] => green
//     [orange] => orange
// )

Debe saber que la array_values()función devuelve una matriz indexada de valores,  array_keys() devuelve una matriz de claves de una matriz determinada e  array_flip() intercambia claves con valores:

01
02
03
04
05
06
07
08
09
10
print_r(array_keys($array)); // ['sky', 'grass', 'orange']
print_r(array_values($array)); // ['blue', 'green', 'orange']
print_r(array_flip($array));
 
// Array
// (
//     [blue] => sky
//     [green] => grass
//     [orange] => orange
// )

Puede verificar si una matriz contiene un valor específico y obtener su primera clave correspondiente usando la  array_search() función. También puede usarlo  in_array() si solo desea saber si una matriz contiene un elemento específico y no está interesado en su posición. Considere usar la  array_key_exists() función cuando desee verificar si la matriz usa una clave determinada.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
dieciséis
17
18
19
20
21
22
23
24
25
26
$values = ["Apples", "Bananas", "Mangoes", "100", "200"];
 
if(in_array(100, $values)) {
    echo '100 is one of the values';
}
// 100 is one of the values
 
if(in_array(200, $values) !== false) {
    echo '200 is not one of the values';
}
// 200 is not one of the values
 
$values = ["Apples", "Bananas", "Mangoes", "100", "200", 100];
 
echo array_search(100, $values);
// 3
 
echo array_search(100, $values, true);
// 5
 
$values = ["Apples" => 100, "Bananas" => 10, "Mangoes" => 45];
 
if(array_key_exists("Apples", $values)) {
    echo 'We have apples.';
}
// We have apples.

Como muestra el ejemplo anterior, asegúrese de utilizar una verificación estricta de tipos si no desea obtener resultados inesperados.

Si desea buscar varios elementos en una matriz, generalmente es más rápido verificar si contiene un valor en particular primero volteando la matriz con  array_flip() y luego usando  array_key_exists().

Haz tu código más corto

La list()función, que no es realmente una función sino una construcción del lenguaje, está diseñada para asignar variables de forma breve. Por ejemplo, aquí hay un ejemplo básico del uso de la  list() función:

01
02
03
04
05
06
07
08
09
10
// define array
$array = ['a', 'b', 'c'];
 
// without list()
$a = $array[0];
$b = $array[1];
$c = $array[2];
 
// with list()
list($a, $b, $c) = $array;

Esta construcción funciona perfectamente con funciones como  preg_slit() o  explode() . Además, puede omitir algunos parámetros si no necesita definirlos:

1
2
3
$string = 'hello|wild|world';
list($hello, , $world) = explode('|', $string);
echo("$hello, $world"); // hello, world

Además,  list() se puede usar con  foreach, lo que hace que esta construcción sea aún mejor:

1
2
3
4
5
6
$arrays = [[1, 2], [3, 4], [5, 6]];
 
foreach ($arrays as list($a, $b)) {
    $c = $a + $b;
    echo($c . ', '); // 3, 7, 11,
}

Con la  extract() función, puede exportar una matriz asociativa a variables. Para cada elemento de una matriz, se creará una variable con el nombre de una clave y un valor como valor del elemento:

1
2
3
4
5
6
7
8
9
$array = [
    'clothes' => 't-shirt',
    'size'    => 'medium',
    'color'   => 'blue',
];
 
extract($array);
 
echo("$clothes $size $color"); // t-shirt medium blue

Tenga en cuenta que  extract() no es seguro si está trabajando con datos de usuario (como resultados de solicitudes), por lo que es mejor usar esta función con las banderas  EXTR_IF_EXISTS y  EXTR_PREFIX_ALL.

Lo contrario de la función anterior es la  compact() función, que hace una matriz asociativa a partir de variables:

01
02
03
04
05
06
07
08
09
10
11
12
13
$clothes = 't-shirt';
$size = 'medium';
$color = 'blue';
 
$array = compact('clothes', 'size', 'color');
print_r($array);
 
// Array
// (
//     [clothes] => t-shirt
//     [size] => medium
//     [color] => blue
// )

Funciones de filtrado

Hay una gran función para el filtrado de matrices, y se llama  array_filter()Pase la matriz como primer parámetro y una función anónima como segundo parámetro. Regrese  true en una función de devolución de llamada si desea dejar este elemento en la matriz, y  false si no lo desea:

1
2
3
4
5
6
7
$numbers = [20, -3, 50, -99, 55];
 
$positive = array_filter($numbers, function($number) {
    return $number > 0;
});
 
print_r($positive); // [0 => 20, 2 => 50, 4 => 55]

Hay una manera de filtrar no solo por los valores. Puede usar  ARRAY_FILTER_USE_KEY o  ARRAY_FILTER_USE_BOTH como tercer parámetro para pasar la clave o tanto el valor como la clave a la función de devolución de llamada.

Además, puede llamar  array_filter() sin una devolución de llamada para eliminar todos los valores vacíos:

1
2
3
4
5
$numbers = [-1, 0, 1];
 
$not_empty = array_filter($numbers);
 
print_r($not_empty); // [0 => -1, 2 => 1]

Solo puede obtener valores únicos de una matriz usando la  array_unique() función. Tenga en cuenta que la función conservará las claves de los primeros elementos únicos:

01
02
03
04
05
06
07
08
09
10
11
12
13
$array = [1, 1, 1, 1, 2, 2, 2, 3, 4, 5, 5];
$uniques = array_unique($array);
 
print_r($uniques);
 
// Array
// (
//     [0] => 1
//     [4] => 2
//     [7] => 3
//     [8] => 4
//     [9] => 5
// )

Con  array_column(), puede obtener una lista de valores de columna de una matriz multidimensional, como una respuesta de una base de datos SQL o una importación de un archivo CSV. Simplemente pase una matriz y un nombre de columna:

1
2
3
4
5
6
7
8
9
$array = [
    ['id' => 1, 'title' => 'tree'],
    ['id' => 2, 'title' => 'sun'],
    ['id' => 3, 'title' => 'cloud'],
];
 
$ids = array_column($array, 'id');
 
print_r($ids); // [1, 2, 3]

A partir de PHP 7,  array_column() se vuelve aún más poderoso, porque ahora se le permite  trabajar con una matriz de objetos . Así que trabajar con una variedad de modelos se volvió más fácil:

1
2
$cinemas = Cinema::find()->all();
$cinema_ids = array_column($cinemas, 'id'); // php7 forever!

Caminando a través de las matrices

Usando  array_map(), puede aplicar una devolución de llamada a cada elemento de una matriz. Puede pasar un nombre de función o una función anónima para obtener una nueva matriz basada en la matriz dada:

01
02
03
04
05
06
07
08
09
10
11
$cities = ['Berlin', 'KYIV', 'Amsterdam', 'Riga'];
$aliases = array_map('strtolower', $cities);
 
print_r($aliases); // ['berlin', 'kyiv, 'amsterdam', 'riga']
 
$numbers = [1, -2, 3, -4, 5];
$squares = array_map(function($number) {
    return $number ** 2;
}, $numbers);
 
print_r($squares);  // [1, 4, 9, 16, 25]

Existe el mito de que no hay forma de pasar valores y claves de una matriz a una devolución de llamada, pero podemos romperlo:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
$model = ['id' => 7, 'name'=>'James'];
 
$callback = function($key, $value) {
    return "$key is $value";
};
 
$res = array_map($callback, array_keys($model), $model);
print_r($res);
 
// Array
// (
//     [0] => id is 7
//     [1] => name is James
// )

Pero esto parece sucio. Es mejor usar  en su array_walk() lugar. Esta función tiene el mismo aspecto que  array_map(), pero funciona de manera diferente. En primer lugar, una matriz se pasa mediante una referencia, por lo  array_walk() que no crea una nueva matriz, sino que cambia una matriz determinada. Entonces, como una matriz de origen, puede pasar el valor de la matriz usando una referencia en una devolución de llamada. Las claves de matriz también se pueden pasar fácilmente:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
dieciséis
17
18
$fruits = [
    'banana' => 'yellow',
    'apple' => 'green',
    'orange' => 'orange',
];
 
array_walk($fruits, function(&$value, $key) {
    $value = "$key is $value";
});
 
print_r($fruits);
 
// Array
// (
//     [banana] => banana is yellow
//     [apple] => apple is green
//     [orange] => orange is orange
// )

Unirse a las matrices

La mejor manera de fusionar dos o más arreglos en PHP es usar la  array_merge() función. Los elementos de las matrices se fusionarán y los valores con las mismas claves de cadena se sobrescribirán con el último valor:

01
02
03
04
05
06
07
08
09
10
11
12
$array1 = ['a' => 'a', 'b' => 'b', 'c' => 'c'];
$array2 = ['a' => 'A', 'b' => 'B', 'D' => 'D'];
 
$merge = array_merge($array1, $array2);
print_r($merge);
// Array
// (
//     [a] => A
//     [b] => B
//     [c] => c
//     [D] => D
// )

Para eliminar valores de matriz de otra matriz (o matrices), use  array_diff()Para obtener valores que están presentes en matrices dadas, use  array_intersect()Los siguientes ejemplos mostrarán cómo funciona:

1
2
3
4
5
6
7
8
$array1 = [1, 2, 3, 4];
$array2 =       [3, 4, 5, 6];
 
$diff = array_diff($array1, $array2);
print_r($diff); // [0 => 1, 1 => 2]
 
$intersect = array_intersect($array1, $array2);
print_r($intersect);  // [2 => 3, 3 => 4]

Haz las matemáticas con valores de matriz

Úselo  array_sum() para obtener una suma de valores de matriz,  array_product() para multiplicarlos o crear su propia fórmula con  array_reduce():

1
2
3
4
5
6
7
8
$numbers = [1, 2, 3, 4, 5];
 
echo(array_sum($numbers)); // 15
echo(array_product($numbers)); // 120
 
echo(array_reduce($numbers, function($carry, $item) {
    return $carry ? $carry / $item : 1;
})); // 0.0083 = 1/2/3/4/5

Para contar todos los valores de una matriz, utilice  array_count_values()Dará todos los valores únicos de una matriz determinada como claves y un recuento de estos valores como valor:

01
02
03
04
05
06
07
08
09
10
11
$things = ['apple', 'apple', 'banana', 'tree', 'tree', 'tree'];
$values = array_count_values($things);
 
print_r($values);
 
// Array
// (
//     [apple] => 2
//     [banana] => 1
//     [tree] => 3
// )

Generación de matrices

Para generar una matriz con un tamaño dado y el mismo valor, use  array_fill():

1
2
$bind = array_fill(0, 5, '?');
print_r($bind); // ['?', '?', '?', '?', '?']

Para generar una matriz con un rango de claves y valores, como horas del día o letras, use  range() :

1
2
3
4
5
$letters = range('a', 'z');
print_r($letters); // ['a', 'b', ..., 'z']
 
$hours = range(0, 23);
print_r($hours); // [0, 1, 2, ..., 23]

Para obtener una parte de una matriz, por ejemplo, solo los primeros tres elementos, use  array_slice():

1
2
3
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
$top = array_slice($numbers, 0, 3);
print_r($top); // [1, 2, 3]

Si alguna vez desea generar una matriz asociativa con diferentes claves y el mismo valor asignado a cada tecla, simplemente puede usar la  array_fill_keys() función.

01
02
03
04
05
06
07
08
09
10
11
$keys = ["Apples", "Bananas", "Mangoes"];
$fruit_count = array_fill_keys($keys, 100);
 
print_r($fruit_count);
 
/* Array
(
    [Apples] => 100
    [Bananas] => 100
    [Mangoes] => 100
) */

Clasificación de matrices

Es bueno recordar que cada función de clasificación en PHP funciona con matrices por una referencia y devuelve  verdadero  en caso de éxito o  falso  en caso de falla. Hay una función de clasificación básica llamada  sort(), y clasifica los valores en orden ascendente sin conservar las claves. La función de clasificación se puede anteponer con las siguientes letras:

  • a , ordenar preservando claves
  • k , ordenar por claves
  • r , ordenar en orden inverso/descendente
  • u , ordenar con una función de usuario

Puedes ver las combinaciones de estas letras en la siguiente tabla:


unkrtu
unasort()
arsort()uasort()
k
ksort()krsort()
rarsort()krsort()rsort()
tuuasort()

usort()

Combinar funciones de matriz como un jefe

La verdadera magia comienza cuando comienzas a combinar funciones de matriz. Así es como puede recortar y eliminar valores vacíos en una sola línea de código con  array_filter() y  array_map():

1
2
3
4
$values = ['say  ', '  bye', ' ', ' to', ' spaces ', '   '];
 
$words = array_filter(array_map('trim', $values));
print_r($words); // ['say', 'bye', 'to', 'spaces']

Para crear una identificación para un mapa de título a partir de una serie de modelos, podemos usar una combinación de  array_combine() y  array_column():

1
2
3
4
5
6
$models = [$model1, $model2, $model3];
 
$id_to_title = array_combine(
    array_column($models, 'id'),
    array_column($models, 'title')
);

Para obtener los tres primeros valores de una matriz, podemos usar  array_count_values(),  arsort()y  array_slice():

01
02
03
04
05
06
07
08
09
10
11
12
13
$letters = ['a', 'a', 'a', 'a', 'b', 'b', 'c', 'd', 'd', 'd', 'd', 'd'];
 
$values = array_count_values($letters); // get key to count array
arsort($values); // sort descending preserving key
$top = array_slice($values, 0, 3); // get top 3
 
print_r($top);
// Array
// (
//     [d] => 5
//     [a] => 4
//     [b] => 2
// )

Es fácil de usar  array_sum() y  array_map() calcular la suma del pedido en unas pocas filas:

01
02
03
04
05
06
07
08
09
10
11
$order = [
    ['product_id' => 1, 'price' => 99, 'count' => 1],
    ['product_id' => 2, 'price' => 50, 'count' => 2],
    ['product_id' => 2, 'price' => 17, 'count' => 3],
];
 
$sum = array_sum(array_map(function($product_row) {
    return $product_row['price'] * $product_row['count'];
}, $order));
 
print_r($sum); // 250

Conclusión

Como puede ver, el conocimiento de las funciones principales de la matriz puede hacer que su código sea mucho más breve y legible. Por supuesto, PHP tiene muchas más funciones de matriz, e incluso las funciones dadas tienen muchas variaciones para usar con parámetros y banderas adicionales, pero creo que en este tutorial hemos cubierto los conceptos básicos que todo desarrollador de PHP debería saber.

Fuente en ingles:

https://code.tutsplus.com/tutorials/working-with-php-arrays-in-the-right-way--cms-28606