121 votes

Une chaîne numérique comme clé de tableau en PHP

Est-il possible d'utiliser une chaîne numérique telle que "123" comme clé dans un tableau PHP, sans qu'elle soit convertie en un nombre entier ?

$blah = array('123' => 1);
var_dump($blah);

imprime

array(1) {
  [123]=>
  int(1)
}

Je veux

array(1) {
  ["123"]=>
  int(1)
}

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

97voto

Hamish Points 11431

Non ; non, ça ne l'est pas :

De le manuel :

Une clé peut être un nombre entier ou une chaîne de caractères. Si une clé est la représentation standard d'un nombre entier, elle sera interprétée comme telle (par exemple, "8" sera interprété comme 8, tandis que "08" sera interprété comme "08").

Addendum

En raison des commentaires ci-dessous, j'ai pensé qu'il serait amusant de souligner que ce comportement est similaire mais pas identique aux clés des objets JavaScript.

foo = { '10' : 'bar' };

foo['10']; // "bar"
foo[10]; // "bar"
foo[012]; // "bar"
foo['012']; // undefined!

5 votes

Il semble qu'il y ait un moyen, en fait ! N'êtes-vous pas d'accord avec cette réponse ? stackoverflow.com/a/35180513/247696

1 votes

Comment ? foo[012] return "bar"

4 votes

@Himanshu : parce que php interprète les nombres commençant par 0 comme octal. donc 012 est octal 10.

12voto

steampowered Points 2179

Si vous devez utiliser une clé numérique dans une structure de données php, un objet fera l'affaire. Et les objets préservent l'ordre, ce qui permet d'itérer.

$obj = new stdClass();
$key = '3';
$obj->$key = 'abc';

0 votes

C'est une très bonne suggestion. Je suis en train d'écrire du code pour un framework et je suis confronté à quelqu'un qui passe un tableau qui pourrait avoir une indexation "accidentelle" : array('this', 'that') ou une indexation "associative" : array(123=>array('this', 'that')). Maintenant, grâce à vous, je peux juste taper l'indice ;) +1

0 votes

Mais est-il possible d'utiliser une chaîne numérique comme "123" comme clé dans un tableau PHP, sans qu'elle soit convertie en un nombre entier ?

0 votes

@Flimm non ce n'est pas possible, c'est pourquoi je propose ma solution.

12voto

Undolog Points 230

Ma solution de rechange est la suivante :

$id = 55;
$array = array(
  " $id" => $value
);

L'espace char (prepend) est une bonne solution car il permet de conserver la conversion en int :

foreach( $array as $key => $value ) {
  echo $key;
}

Vous verrez 55 comme int.

4 votes

Ou "0$id" => $value . Prédire avec 0 fonctionne aussi.

0 votes

Vous dites donc qu'il n'est pas possible d'utiliser une chaîne numérique comme "123" comme clé dans un tableau PHP, sans qu'elle soit convertie en un nombre entier ?

0 votes

@Flimm Oui, ce n'est pas possible. Pas avec array de toute façon.

5voto

stillstanding Points 10346

Vous pouvez taper la clé dans une chaîne de caractères, mais elle sera finalement convertie en un nombre entier en raison de la flexibilité de PHP en matière de typage. Voyez par vous-même :

$x=array((string)123=>'abc');
var_dump($x);
$x[123]='def';
var_dump($x);

Extrait du manuel PHP :

Une clé peut être soit un nombre entier, soit une chaîne de caractères. Si une clé est le standard d'un entier, elle sera interprétée comme telle (c'est-à-dire que "8" sera interprété comme 8, tandis que "08" sera interprété comme "08"). Les flottants dans la clé sont tronqués en entier . Les types de tableaux indexés et associatifs sont du même type en PHP, et peuvent tous deux contenir des entiers. et des chaînes de caractères.

1 votes

La conversion n'est pas due à une mauvaise saisie ; php détermine si la chaîne de caractères regarde numérique et le convertit ensuite.

1 votes

Donc vous dites que ce n'est pas possible ? Cette réponse montre qu'il existe un moyen d'utiliser une chaîne qui ressemble à un nombre entier comme clé dans un tableau.

0 votes

À mon avis, le problème vient de l'interpréteur PHP. Il n'est même pas possible d'imaginer un langage qui mélange des chaînes de caractères et des entiers comme clés de tableaux. La meilleure solution ? Comme proposé par Undolog stackoverflow.com/a/15413637/1977778 la meilleure solution est d'utiliser un espace à la fin... Malheureusement.

0voto

fisharebest Points 552

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

1 votes

Ce n'est pas vraiment une réponse à la question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X