Você realmente sabe o que são matrizes?

Onde trabalho, espero que os desenvolvedores da Web tenham conhecimento de PHP e JavaScript. Durante as entrevistas, descobri que basta fazer uma pergunta simples para descobrir até que ponto o desenvolvedor entende as ferramentas que ele usa todos os dias. Esta pergunta é:

Quais são as semelhanças e diferenças entre matrizes em JavaScript e em PHP?

A capacidade de escrever código é uma coisa. E outra - uma compreensão dos mecanismos internos das línguas usadas. A resposta para essa pergunta única me dá um mar inteiro de informações sobre o entrevistado. De fato, quase toda linguagem comum possui matrizes. É fácil fazer uma suposição segundo a qual matrizes em diferentes idiomas são, mais ou menos, a mesma coisa. Muitos programadores fazem isso.





Essa é uma suposição incorreta, levando a muitos pequenos erros, à escrita de código irracionalmente organizado, à incapacidade de usar efetivamente os pontos fortes da linguagem.

Matrizes e seu idioma nativo - C


A linguagem C não é a primeira linguagem de programação da história, mas é a linguagem que mais influenciou o setor de TI. Muitos desenvolvedores ensinaram nos institutos C como sua primeira língua. Tanto o PHP quanto o JavaScript tiraram algo de C. Como resultado, podemos observar algumas semelhanças entre essas linguagens e C, e é a análise de matrizes em C que nos permitirá mostrar até que ponto essas estruturas de dados avançaram desde 1972.

Em C, matrizes são fortemente tipadas e têm um comprimento fixo.

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

Acima estão algumas declarações de matriz. Eles podem armazenar apenas números inteiros, cujo número não excede 10.

Ao trabalhar com essas matrizes, um loop é usado for. Esse padrão, sem nenhuma necessidade real, é copiado em muitas outras linguagens de programação:

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

Esse design não parece selvagem em JavaScript ou PHP. Mas é aqui que está o perigo.

Matrizes JavaScript


Você pode imaginar que matrizes em JavaScript são muito semelhantes às matrizes em C. E a verdade é que as seguintes construções parecem perfeitamente normais em JS:

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

No entanto, matrizes em JavaScript e em C são duas coisas diferentes. Por exemplo, o seguinte, obviamente, não é possível em 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}];

Em JavaScript, as matrizes são de comprimento variável. O tipo de seu conteúdo não é controlado - assim como o tipo de variáveis ​​comuns. A linguagem assume o controle da memória, como resultado, o comprimento da matriz pode aumentar ou diminuir, e o desenvolvedor não pode pensar nisso. Matrizes JavaScript são, de fato, muito semelhantes às listas.

A enumeração de matriz pode ser organizada usando um método malsucedido emprestado de C:

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

No entanto, não precisamos usar essa abordagem para enumerar matrizes JS. Por exemplo, existem variáveis ​​intermediárias desnecessárias. Nesse projeto, podem ocorrer erros, cuja causa são valores indefinidos ou incorretos. Existe algum valor no elemento da matriz fibonacci[10]? E se o valor estiver lá - é um número inteiro?

Mas o JavaScript tem mecanismos muito melhores para trabalhar com matrizes. Matrizes em JS não são apenas algumas estruturas de dados simples. Eles, como funções, são objetos de primeira classe. Eles possuem métodos para resolver adequadamente vários problemas:

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

Isso é muito melhor do que fazer um loop através de uma matriz for.


Alguns métodos de matrizes

Além disso, como já mencionado, o comprimento das matrizes em JS, diferente do comprimento das matrizes C, não é fixo. Isso permite que você tenha efeitos bastante interessantes em matrizes que afetam seu tamanho. Portanto, usando o método, você podepopextrair o último elemento da matriz. E o métodopushpermite adicionar um novo elemento ao final da matriz. O métodounshiftpermite adicionar um elemento ao início da matriz. E o métodoshifté extrair o primeiro elemento da matriz. Usando diferentes combinações desses métodos, você pode trabalhar com matrizes como em pilhas ou filas. Tudo depende das necessidades do programador.

Matrizes em PHP


Matrizes em PHP são quase como matrizes JavaScript.

Eles, como matrizes JS, são de tamanho variável e tipagem fraca. Portanto, pode ser tentador decidir que matrizes no PHP e no JS são uma e a mesma coisa.

$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; };

As funções Lambda no PHP não são tão bonitas quanto as funções semelhantes no JS (no ES6), mas este exemplo escrito em PHP é funcionalmente equivalente ao exemplo JS considerado anteriormente.

Não pode ser utilizado, e análogos descritos acima funções de adicionar elementos para a matriz e recuperá-los a partir dele ( array_push, array_pop, array_shift, array_unshift).

Mas você não pode escrever algo semelhante ao seguinte em JavaScript (assim como em C) (é claro, você pode escrever código semelhante em JavaScript, mas isso não funcionará como no PHP):

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

No PHP, do ponto de vista técnico, matrizes são tabelas de hash ou dicionários. Eles usam pares de chave / valor. As chaves podem ter qualquer valor primitivo: números inteiros, números de ponto flutuante, seqüências de caracteres. Como matrizes php são baseadas em dicionários, encontrar valores-chave nessas matrizes é extremamente eficiente. Ou seja, a complexidade do tempo da pesquisa é O(1).

Isso significa que as matrizes PHP podem servir com êxito como tabelas de pesquisa simples:

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

As matrizes PHP oferecem ao desenvolvedor muita flexibilidade. Essas matrizes podem ser classificadas por chave e valor. Você pode, por exemplo, "inverter" uma matriz com array_flip, trocando as chaves e os valores, o que torna possível organizar com muita eficiência uma pesquisa na matriz dos dados necessários.

Encontrar um valor específico em uma matriz regular é demorado O(n), pois durante a pesquisa você precisa verificar cada valor armazenado na matriz. E no PHP, é fácil aumentar a complexidade de tempo da mesma operação para O(1):

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

Obviamente, algo semelhante também está disponível em JavaScript, embora aqui já seja necessário recorrer aos recursos dos objetos. Mas por causa disso, você precisa fazer alguns compromissos. Ou seja, ao trabalhar com objetos, o desenvolvedor não terá métodos de matriz como os que falamos acima.

Se continuarmos a discussão sobre matrizes PHP, podemos dizer que sua enumeração é organizada de maneira simples e segura. Aqui é possível aplicar um ciclo forparecido com o mesmo ciclo de C, mas antes de fazer isso, você deve pensar cuidadosamente sobre o porquê de fazer exatamente isso. O PHP, graças aos loops foreach, permite resolver problemas específicos de matrizes de tamanho variável que podem conter valores de diferentes tipos:

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

O loop fornece acesso a chaves e valores, o que permite ao programador trabalhar com ambos.

Vale ressaltar que as matrizes PHP diferem das matrizes JS, pois no PHP você precisa usar funções externas a elas para executar algumas operações com matrizes:

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

É funcional, mas não tão bonito quanto no JavaScript. Se você deseja escrever um código para trabalhar com matrizes PHP que se assemelhem ao código usado no JavaScript (há fortes argumentos a favor dessa abordagem), talvez seja necessário procurar uma solução especializada. Diga - para uma classe a Collectionpartir do framework Laravel. No entanto, o PHP permite criar objetos cujos recursos se assemelham aos de matrizes (por exemplo, eles podem ser processados ​​em loops foreach).

Se o PHP é sua principal linguagem de programação, você pode se acostumar e esquecer completamente o poder que se esconde em seus mecanismos fundamentais.

As matrizes PHP são, em poucas palavras, o recurso mais subestimado e invisível da linguagem, que, se usado corretamente, pode ser de grande benefício.

Resumo: Pergunta e resposta


Pergunta : Quais são as semelhanças e diferenças entre matrizes em JavaScript e PHP?

Resposta : em PHP e JavaScript, matrizes são essencialmente listas de tamanho variável com tipagem fraca. Em JavaScript, as chaves para os elementos da matriz são números inteiros ordenados. No PHP, as matrizes podem ser comparadas com listas que suportam classificação e com dicionários nos quais é conveniente procurar itens por chave. As chaves das matrizes PHP podem ser quaisquer valores de tipos primitivos e você pode classificá-las por chaves ou valores.

Queridos leitores! Quais recursos padrão você acha que as matrizes JavaScript mais não possuem?


All Articles