Dans PHP, Array_Fill () est une fonction très pratique pour remplir un tableau avec des valeurs spécifiées. Il est généralement utilisé pour initialiser les tableaux, en particulier lorsque nous devons générer rapidement un tableau de valeurs par défaut. Cependant, de nombreux développeurs sont enclins à tomber dans des malentendus communs lors de l'utilisation de Array_Fill () pour créer des tableaux bidimensionnels, ce qui conduit à un comportement inattendu dans le programme. Cet article explorera ces erreurs courantes et comment les éviter correctement.
Avant de creuser la question, passons en revue brièvement l'utilisation de base de Array_Fill () :
$filledArray = array_fill(0, 5, 'default');
// résultat: ['default', 'default', 'default', 'default', 'default']
Cette fonction accepte trois paramètres:
Démarrer l'index (à partir de quel index pour commencer le remplissage)
Longueur du tableau (remplie de plusieurs éléments)
Valeur de remplissage
Lorsque nous essayons d'utiliser array_fill () pour créer un tableau bidimensionnel, tel que 5 lignes, chacune avec 3 valeurs par défaut «par défaut» , de nombreux développeurs rédigeront le code suivant:
$matrix = array_fill(0, 5, array_fill(0, 3, 'default'));
À première vue, cette façon d'écrire semble raisonnable. Le résultat de sortie est également comme prévu:
[
['default', 'default', 'default'],
['default', 'default', 'default'],
['default', 'default', 'default'],
['default', 'default', 'default'],
['default', 'default', 'default']
]
Mais le problème est: ces sous-réseaux sont en fait des références au même tableau !
Autrement dit, si nous modifions la valeur de l'un des sous-réseaux:
$matrix[0][0] = 'changed';
Cela fait que la première valeur de toutes les lignes devient «modifiée» :
[
['changed', 'default', 'default'],
['changed', 'default', 'default'],
['changed', 'default', 'default'],
['changed', 'default', 'default'],
['changed', 'default', 'default']
]
En effet, array_fill () est rempli de références au même tableau lorsque le troisième paramètre est un tableau, plutôt que de créer une nouvelle instance de tableau à la fois.
Pour résoudre ce problème, nous devons nous assurer que chaque sous-réseau est une instance indépendante. La façon la plus sûre de le faire est d'utiliser une boucle:
$matrix = [];
for ($i = 0; $i < 5; $i++) {
$matrix[$i] = array_fill(0, 3, 'default');
}
Cela garantit que le tableau de chaque ligne est une nouvelle copie et ne se affectera pas mutuellement.
Si vous encapsulez une fonction qui crée un tableau bidimensionnel, veillez à ne pas créer de sous-réseaux en dehors de la fonction, puis à les réutiliser. Par exemple:
Démonstration d'erreur:
function createMatrix($rows, $cols, $defaultValue) {
$rowTemplate = array_fill(0, $cols, $defaultValue);
return array_fill(0, $rows, $rowTemplate);
}
Ce problème est le même que celui décrit ci-dessus, toutes les lignes se réfèrent au même $ rowTemplate . La modification d'une ligne affectera toutes les lignes.
Écriture correcte:
function createMatrix($rows, $cols, $defaultValue) {
$matrix = [];
for ($i = 0; $i < $rows; $i++) {
$matrix[] = array_fill(0, $cols, $defaultValue);
}
return $matrix;
}
Supposons que vous créez un outil de génération de questions à remplissage en ligne (tel que https://m66.net/tools/quiz-generator ), vous devez créer une carte de question vide, où la valeur par défaut de chaque boîte est nul :
$questionBoard = [];
for ($i = 0; $i < 10; $i++) {
$questionBoard[] = array_fill(0, 5, null);
}
Cette approche peut éviter de partager accidentellement de la mémoire sur l'ensemble du tableau de questions, provoquant des bogues dans l'interaction utilisateur ou la logique ultérieure.
Array_Fill () est un outil efficace, mais en ce qui concerne les tableaux imbriqués (bidimensionnel ou multidimensionnel), nous devons nous méfier des références partagées . En utilisant des boucles et en garantissant que chaque sous-réseau est une nouvelle instance, nous pouvons créer des structures de données plus robustes et prévisibles.
Comprendre la valeur et le mécanisme de référence en PHP non seulement contribuent à éviter ce problème, mais améliore également votre capacité à gérer des structures de tableau complexes dans de grands projets.