J'ai rencontré ce problème avec un tableau dont les clés sont à la fois '0' et ''. Cela signifie que je ne pouvais pas vérifier les clés de mon tableau avec == ou ===.
$array=array(''=>'empty', '0'=>'zero', '1'=>'one');
echo "Test 1\n";
foreach ($array as $key=>$value) {
if ($key == '') { // Error - wrongly finds '0' as well
echo "$value\n";
}
}
echo "Test 2\n";
foreach ($array as $key=>$value) {
if ($key === '0') { // Error - doesn't find '0'
echo "$value\n";
}
}
La solution de contournement consiste à convertir les clés du tableau en chaînes de caractères avant de les utiliser.
echo "Test 3\n";
foreach ($array as $key=>$value) {
if ((string)$key == '') { // Cast back to string - fixes problem
echo "$value\n";
}
}
echo "Test 4\n";
foreach ($array as $key=>$value) {
if ((string)$key === '0') { // Cast back to string - fixes problem
echo "$value\n";
}
}
8 votes
Puisque PHP est faiblement typé,
"123"
==123
pour presque tous les usages. Quelle est la raison pour laquelle vous voulez qu'il soit spécifiquement une chaîne de caractères (et avoir un int est mauvais) ?22 votes
La raison qui me vient à l'esprit concerne les fonctions de tableau telles que
array_merge
"Si les tableaux d'entrée ont les mêmes clés de chaîne, alors la dernière valeur pour cette clé écrasera la précédente. Si, cependant, les tableaux contiennent des clés numériques la valeur ultérieure ne remplacera pas la valeur originale, mais sera ajoutée."9 votes
Un autre exemple où les chaînes numériques comme clés de tableau sont problématiques :
asort
2 votes
Duplicata possible de Comment puis-je forcer PHP à utiliser des chaînes de caractères pour les clés des tableaux ?
0 votes
@nawfal : Je serais tenté de fermer ces questions dans l'autre sens. Et/ou peut-être demander à un mod de fusionner les réponses. Ou peut-être juste Laissez-les être.
1 votes
Cela me pose également un problème lorsque je fusionne deux tableaux avec des chaînes de chiffres spécifiques comme clés, car array_merge réinitialise ces clés.
5 votes
Autre cas d'utilisation : les tests unitaires de transition de données JSON. Convertir un tel tableau en JSON et inversement ne vous permettra pas d'affirmer que l'original et le résultat sont exactement les mêmes.
1 votes
@ircmaxell J'ai une bibliothèque qui fait des vérifications strictes sur les clés des tableaux.
0 votes
@swenedo comment asort échoue-t-il sur de tels tableaux ? Cela fonctionne pour moi.
0 votes
J'étais curieux de savoir si
array_change_key_case($array)
fonctionnerait mais hélas les règles internes sont inattaquables (directement).0 votes
@swenedo
asort()
c'est très bien Même résultat depuis PHP 4.3.