Savez-vous vraiment ce que sont les tableaux?

Là où je travaille, j'attends des connaissances PHP et JavaScript des développeurs web. Lors des entretiens, j'ai trouvé qu'il suffit de poser une seule question simple pour savoir à quel point le développeur comprend les outils qu'il utilise au quotidien. Cette question est:

Quelles sont les similitudes et les différences entre les tableaux en JavaScript et en PHP?

La capacité d'écrire du code est une chose. Et bien un autre - une compréhension des mécanismes internes des langues utilisées. La réponse à cette seule question me donne toute une série d'informations sur la personne interrogée. En effet, presque tous les langages communs ont des tableaux. Il est facile de faire une hypothèse selon laquelle les tableaux dans différentes langues sont, plus ou moins, la même chose. De nombreux programmeurs le font.





Il s'agit d'une hypothèse incorrecte, conduisant à de nombreuses petites erreurs, à l'écriture de code arrangé de façon irrationnelle, à l'incapacité d'utiliser efficacement les forces du langage.

Tableaux et leur langue maternelle - C


Le langage C n'est pas le premier langage de programmation de l'histoire, mais c'est le langage qui a influencé l'industrie informatique plus que d'autres. De nombreux développeurs ont enseigné dans les instituts C comme première langue. PHP et JavaScript ont tous deux tiré quelque chose de C.Par conséquent, nous pouvons observer certaines similitudes entre ces langages et C, et c'est l'analyse des tableaux en C qui nous permettra de montrer jusqu'où ces structures de données ont progressé depuis 1972.

En C, les tableaux sont fortement typés et ont une longueur fixe.

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

Ci-dessus, deux déclarations de tableau. Ils ne peuvent stocker que des entiers dont le nombre ne dépasse pas 10.

Lorsque vous travaillez avec de tels tableaux, une boucle est utilisée for. Ce modèle, sans aucun besoin réel, est copié dans de nombreux autres langages de programmation:

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

Une telle conception ne semble pas sauvage ni en JavaScript ni en PHP. Mais c'est là que réside le danger.

Tableaux JavaScript


Vous pouvez imaginer que les tableaux en JavaScript sont très similaires aux tableaux en C. Et la vérité est que les constructions suivantes semblent parfaitement normales dans JS:

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

Cependant, les tableaux en JavaScript et en C sont deux choses différentes. Par exemple, ce qui suit n'est évidemment pas possible 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, les tableaux sont de longueur variable. Le type de leur contenu n'est pas contrôlé - tout comme le type de variables ordinaires. Le langage prend le contrôle de la mémoire, par conséquent, la longueur de la baie peut augmenter ou diminuer, et le développeur ne peut pas y penser. Les tableaux JavaScript sont, en fait, très similaires aux listes.

L'énumération de tableau peut être organisée à l'aide d'une méthode infructueuse empruntée à C:

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

Cependant, nous n'avons pas besoin d'utiliser cette approche pour énumérer les tableaux JS. Par exemple, il existe des variables intermédiaires inutiles. Dans une telle conception, des erreurs peuvent bien se produire, dont la cause est des valeurs indéfinies ou incorrectes. Y a-t-il une valeur dans l'élément de tableau fibonacci[10]? Et si la valeur est là - est-ce un entier?

Mais JavaScript a de bien meilleurs mécanismes pour travailler avec les tableaux. Les tableaux dans JS ne sont pas simplement de simples structures de données. Ce sont, comme les fonctions, des objets de première classe. Ils ont des méthodes pour résoudre adéquatement divers problèmes:

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

C'est bien mieux que de parcourir un tableau en boucle for.


Certaines méthodes de tableaux

En outre, comme déjà mentionné, la longueur des tableaux en JS, contrairement à la longueur des tableaux C, n'est pas fixe. Cela vous permet d'avoir des effets assez intéressants sur les tableaux qui affectent leur longueur. Ainsi, en utilisant la méthode, vous pouvezpopextraire le dernier élément du tableau. Et la méthodepushvous permet d'ajouter un nouvel élément à la fin du tableau. La méthodeunshiftvous permet d'ajouter un élément au début du tableau. Et la méthodeshiftconsiste à extraire le premier élément du tableau. En utilisant différentes combinaisons de ces méthodes, vous pouvez travailler avec des tableaux comme avec des piles ou des files d'attente. Tout dépend des besoins du programmeur.

Tableaux en PHP


Les tableaux en PHP sont presque comme des tableaux JavaScript.

Comme les tableaux JS, ils sont de longueur variable et de typage faible. Par conséquent, il peut être tentant de décider que les tableaux en PHP et en JS sont la même chose.

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

Les fonctions lambda en PHP ne sont pas aussi belles que des fonctions similaires en JS (dans ES6), mais cet exemple, écrit en PHP, est fonctionnellement équivalent à l'exemple JS précédemment considéré.

Il peut être utilisé, et des analogues décrits ci - dessus fonctionne pour ajouter des éléments au tableau et les récupérer de lui ( array_push, array_pop, array_shift, array_unshift).

Mais en JavaScript (ainsi qu'en C), vous ne pouvez pas écrire quelque chose de similaire à ce qui suit (bien sûr, vous pouvez écrire du code similaire en JavaScript, mais cela ne fonctionnera pas comme en PHP):

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

En PHP, d'un point de vue technique, les tableaux sont des tables de hachage ou des dictionnaires. Ils utilisent des paires clé / valeur. Les clés peuvent avoir n'importe quelle valeur primitive: entiers, nombres à virgule flottante, chaînes. Étant donné que les tableaux php sont basés sur des dictionnaires, trouver des valeurs clés dans ces tableaux est extrêmement efficace. À savoir, la complexité temporelle de la recherche est O(1).

Cela signifie que les tableaux PHP peuvent servir avec succès de simples tables de recherche:

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

Les tableaux PHP offrent au développeur beaucoup de flexibilité. Ces tableaux peuvent être triés par clé et valeur. Vous pouvez, par exemple, «retourner» un tableau avec array_flip, en échangeant les clés et les valeurs, ce qui permet d'organiser très efficacement une recherche dans le tableau des données nécessaires.

Trouver une valeur spécifique dans un tableau standard prend du temps O(n), car pendant la recherche, vous devez vérifier chaque valeur stockée dans le tableau. Et en PHP, il est facile de rendre la complexité temporelle d'une même opération équivalente à O(1):

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

Bien sûr, quelque chose de similaire est également disponible en JavaScript, bien qu'ici, il sera déjà nécessaire de recourir aux capacités des objets. Mais à cause de cela, vous devez faire des compromis. À savoir, lorsqu'il travaille avec des objets, le développeur n'aura pas de méthodes de tableau comme celles dont nous avons parlé ci-dessus.

Si nous continuons la discussion sur les tableaux PHP, nous pouvons dire que leur énumération est organisée simplement et en toute sécurité. Ici, il est possible d'appliquer un cycle forressemblant au même cycle à partir de C, mais avant de le faire, vous devez soigneusement réfléchir à la raison pour laquelle faire exactement cela. PHP, grâce aux boucles foreach, vous permet de résoudre des problèmes spécifiques aux tableaux de longueur variable pouvant contenir des valeurs de différents types:

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

La boucle donne accès aux clés et aux valeurs, ce qui permet au programmeur de travailler avec les deux.

Il convient de noter que les tableaux PHP diffèrent des tableaux JS en ce sens qu'en PHP, vous devez utiliser des fonctions externes pour effectuer certaines opérations avec les tableaux:

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

Il est fonctionnel, mais pas aussi beau qu'en JavaScript. Si vous voulez écrire du code pour travailler avec des tableaux PHP qui ressemble au code utilisé en JavaScript (il y a des arguments forts en faveur de cette approche), alors vous devrez peut-être chercher une solution spécialisée. Dites - à une classe Collectiondu framework Laravel. Cependant, PHP vous permet de créer des objets dont les capacités ressemblent à celles des tableaux (par exemple, ils peuvent être traités en boucles foreach).

Si PHP est votre langage de programmation principal, vous pouvez vous y habituer et vous pouvez complètement oublier la puissance qui se cache dans ses mécanismes fondamentaux.

Les tableaux PHP sont, en résumé, la caractéristique la plus sous-estimée et la plus invisible du langage, qui, si elle est utilisée correctement, peut être très utile.

Résumé: questions et réponses


Question : Quelles sont les similitudes et les différences entre les tableaux en JavaScript et en PHP?

Réponse : en PHP et JavaScript, les tableaux sont essentiellement des listes faiblement typées de longueur variable. En JavaScript, les clés des éléments du tableau sont des entiers ordonnés. En PHP, les tableaux peuvent être comparés à des listes prenant en charge le tri et à des dictionnaires dans lesquels il est pratique de rechercher des éléments par clé. Les clés des tableaux PHP peuvent être toutes les valeurs de types primitifs, et vous pouvez trier ces tableaux par clés ou par valeurs.

Chers lecteurs! Selon vous, quelles sont les fonctionnalités standard qui manquent le plus aux tableaux JavaScript?


All Articles