¿Realmente sabes qué son las matrices?

Donde trabajo, espero conocimientos de PHP y JavaScript de los desarrolladores web. Al realizar entrevistas, descubrí que es suficiente con hacer una simple pregunta para descubrir qué tan profundamente comprende el desarrollador las herramientas que usa todos los días. Esta pregunta es:

¿Cuáles son las similitudes y diferencias entre las matrices en JavaScript y en PHP?

La capacidad de escribir código es una cosa. Y otra muy distinta: una comprensión de los mecanismos internos de los idiomas utilizados. La respuesta a esta sola pregunta me da un mar de información sobre el entrevistado. De hecho, casi todos los idiomas comunes tienen matrices. Es fácil hacer una suposición de acuerdo a qué arreglos en diferentes idiomas son, más o menos, lo mismo. Muchos programadores hacen esto.





Esta es una suposición incorrecta, que lleva a muchos pequeños errores, a escribir código irracionalmente arreglado, a la incapacidad de usar efectivamente las fortalezas del lenguaje.

Matrices y su lengua materna - C


El lenguaje C no es el primer lenguaje de programación en la historia, pero es el lenguaje que ha influido en la industria de TI más que otros. Muchos desarrolladores enseñaron en los institutos C como su primer idioma. Tanto PHP como JavaScript tomaron algo de C. Como resultado, podemos observar algunas similitudes entre estos lenguajes y C, y es el análisis de matrices en C que nos permitirá mostrar hasta qué punto estas estructuras de datos han avanzado desde 1972.

En C, las matrices están fuertemente tipadas y tienen una longitud fija.

int myArray[10];
int fibonacci[10] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 34};

Arriba hay un par de declaraciones de matriz. Solo pueden almacenar enteros, cuyo número no excede de 10.

Cuando se trabaja con tales matrices, se usa un bucle for. Este patrón, sin necesidad real, se copia en muchos otros lenguajes de programación:

int i, sum;
for (i = 0; i < 9; i++) {
  sum += fibonacci[i];
}

Tal diseño no parece salvaje ni en JavaScript ni en PHP. Pero aquí es donde radica el peligro.

Matrices de JavaScript


Puede imaginar que las matrices en JavaScript son muy similares a las matrices en C. Y la verdad es que las siguientes construcciones se ven perfectamente normales en JS:

let myArray = [];
let fibonacci = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34];

Sin embargo, las matrices en JavaScript y en C son dos cosas diferentes. Por ejemplo, lo siguiente, obviamente, no es posible en C:

myArray[0] = 5;
myArray[1] = 5.5;
myArray[2] = 'cat';
myArray[3] = [1,2,3];
myArray[4] = (a,b) => {a+b};
myArray[1000] = 'mind blown';
// myArray = [5, 5.5, 'cat', [1,2,3], (a,b) => {a+b}];

En JavaScript, las matrices son de longitud variable. El tipo de sus contenidos no se controla, al igual que el tipo de variables ordinarias. El lenguaje toma el control de la memoria, como resultado, la longitud de la matriz puede aumentar o disminuir, y el desarrollador no puede pensar en ello. Las matrices de JavaScript son, de hecho, muy similares a las listas.

La enumeración de matrices se puede organizar utilizando un método fallido tomado de C:

let sum = 0;
for (i = 0; i < fibonacci.length; i++) {
  sum += fibonacci[i];
}

Sin embargo, no necesitamos usar este enfoque para enumerar matrices JS. Por ejemplo, hay variables intermedias innecesarias. En dicho diseño, pueden surgir errores, cuya causa son valores indefinidos o incorrectos. ¿Hay algún valor en el elemento de matriz fibonacci[10]? Y si el valor está ahí, ¿es un número entero?

Pero JavaScript tiene mecanismos mucho mejores para trabajar con matrices. Las matrices en JS no son solo algunas estructuras de datos simples. Ellos, como las funciones, son objetos de primera clase. Tienen métodos para resolver adecuadamente varios problemas:

let sum = fibonacci
   .filter(Number.isInteger)
   .reduce(
      (x,y) => {return x+y}, 0
    );

Esto es mucho mejor que recorrer una matriz for.


Algunos métodos de matrices

Además, como ya se mencionó, la longitud de las matrices en JS, a diferencia de la longitud de las matrices C, no es fija. Esto le permite tener efectos bastante interesantes en las matrices que afectan su longitud. Entonces, utilizando el método, puedepopextraer el último elemento de la matriz. Y el método lepushpermite agregar un nuevo elemento al final de la matriz. El método leunshiftpermite agregar un elemento al comienzo de la matriz. Y el métodoshiftes extraer el primer elemento de la matriz. Usando diferentes combinaciones de estos métodos, puede trabajar con matrices como con pilas o colas. Todo depende de las necesidades del programador.

Matrices en PHP


Las matrices en PHP son casi como las matrices de JavaScript.

Ellos, como las matrices JS, son de longitud variable y de escritura débil. Por lo tanto, puede ser tentador decidir que las matrices en PHP y en JS son lo mismo.

$myArray = [];
$fibonacci = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34];
$myArray[0] = 5;
$myArray[1] = 5.5;
$myArray[2] = 'cat';
$myArray[3] = [1,2,3];
$myArray[4] = function($a, $b) { return $a + $b; };

Las funciones de Lambda en PHP no son tan hermosas como funciones similares en JS (en ES6), pero este ejemplo, escrito en PHP, es funcionalmente equivalente al ejemplo de JS considerado anteriormente.

No se pueden utilizar, y los análogos descritos anteriormente funciones para añadir elementos a la matriz y recuperarlas de él ( array_push, array_pop, array_shift, array_unshift).

Pero no puede escribir algo similar a lo siguiente en JavaScript (así como en C) (por supuesto, puede escribir código similar en JavaScript, pero no funcionará como en PHP):

$myArray['banana'] = 'yellow fruit';
$myArray[5] = 'is alive';
$myArray[0.02] = 'the 2%';

En PHP, desde un punto de vista técnico, las matrices son tablas hash o diccionarios. Usan pares clave / valor. Las claves pueden ser cualquier valor primitivo: enteros, números de coma flotante, cadenas. Dado que las matrices php se basan en diccionarios, encontrar valores clave en estas matrices es extremadamente eficiente. A saber, la complejidad temporal de la búsqueda es O(1).

Esto significa que las matrices PHP pueden servir con éxito como tablas de búsqueda simples:

$colours = [
  'red' => '#FF0000',
  'green' => '#00FF00',
  'blue' => '#0000FF',
  'orange' => '#FF6600',
];

Las matrices PHP le dan al desarrollador mucha flexibilidad. Estas matrices se pueden ordenar por clave y valor. Puede, por ejemplo, "voltear" una matriz con array_flip, intercambiando las claves y los valores, lo que hace posible organizar de manera muy eficiente una búsqueda en la matriz de los datos necesarios.

Encontrar un valor específico en una matriz regular lleva mucho tiempo O(n), ya que durante la búsqueda debe verificar cada valor almacenado en la matriz. Y en PHP, es fácil hacer que la complejidad temporal de la misma operación sea O(1):

$users = [
  1 => 'Andi',
  2 => 'Benny',
  3 => 'Cara',
  4 => 'Danny',
  5 => 'Emily',
];
$lookupTable = array_flip($users);
return $lookupTable['Benny'];

Por supuesto, algo similar también está disponible en JavaScript, aunque aquí ya será necesario recurrir a las capacidades de los objetos. Pero debido a esto, tienes que hacer algunos compromisos. Es decir, cuando trabaje con objetos, el desarrollador no tendrá métodos de matriz como los que mencionamos anteriormente.

Si continuamos la discusión sobre las matrices PHP, podemos decir que su enumeración está organizada de manera simple y segura. Aquí es posible aplicar un ciclo forsimilar al mismo ciclo de C, pero antes de hacer esto, debe pensar cuidadosamente por qué hacer eso. PHP, gracias a los bucles foreach, le permite resolver problemas específicos de matrices de longitud variable que pueden contener valores de diferentes tipos:

$sum = 0;
foreach ($myArray as $key => $value) {
  $sum += is_numeric($value) ? $value : 0;
}

El bucle da acceso a claves y valores, lo que permite al programador trabajar con ambos.

Vale la pena señalar que las matrices PHP difieren de las matrices JS en que en PHP debe usar funciones externas para realizar algunas operaciones con matrices:

$sum = 
  array_reduce(
    array_filter($fibonacci, 'is_numeric'),
    function ($x, $y) { return $x + $y; },
    0
  };

Es funcional, pero no tan hermoso como en JavaScript. Si desea escribir código para trabajar con matrices PHP que se asemeja al código utilizado en JavaScript (existen argumentos sólidos a favor de este enfoque), es posible que deba buscar una solución especializada. Decir - a una clase Collectiondesde el marco de Laravel. Sin embargo, PHP le permite crear objetos cuyas capacidades se parecen a las de las matrices (por ejemplo, se pueden procesar en bucles foreach).

Si PHP es su lenguaje de programación principal, puede acostumbrarse a él y olvidarse por completo del poder que acecha en sus mecanismos fundamentales.

Las matrices PHP son, en pocas palabras, la característica más subestimada e invisible del lenguaje, que, si se usa correctamente, puede ser de gran beneficio.

Resumen: pregunta y respuesta


Pregunta : ¿Cuáles son las similitudes y diferencias entre las matrices en JavaScript y en PHP?

Respuesta : en PHP y JavaScript, las matrices son esencialmente listas débilmente escritas de longitud variable. En JavaScript, las claves de los elementos de la matriz son enteros ordenados. En PHP, las matrices se pueden comparar con listas que admiten la clasificación y con diccionarios en los que es conveniente buscar elementos por clave. Las claves de las matrices PHP pueden ser cualquier valor de tipos primitivos, y puede ordenar dichas matrices por claves o por valores.

¡Queridos lectores! ¿Qué características estándar crees que carecen más de las matrices de JavaScript?


All Articles