Je suis coincé avec un étrange comportement PHP après un cast. Voici le code:Étrange comportement foreach après un cast
$obj = new stdClass();
$obj->{'0'} = "test";
$array = (array)$obj;
var_dump($array);
Ce code sortie:
array(1) { ["0"]=> string(4) "test" }
tout à fait normal.
Maintenant, j'ajouter un code:
foreach ($array as $key => $value) {
$array[$key] = strtoupper($value);
}
var_dump($array);
Ce sorties de code:
array(2) {
["0"]=>
string(4) "test"
[0]=>
string(4) "TEST"
}
Pourquoi ma clé $ casté en int?
Si je tente un exemple plus simple:
$array = array("0" => "test");
foreach ($array as $key => $value) {
$array[$key] = strtoupper($value);
}
var_dump($array);
Affichera:
array(1) { [0]=> string(4) "TEST" }
Quelqu'un sait pourquoi il y a un casting de ma touche $ pour int?
Mise à jour
J'ai essayé de forcer à jeter ma clé à la chaîne:
$array["{$key}"] = $value;
et
$array[(string)$key] = $value;
Mais ils sont insérés comme int. Donc, ma question devrait être: est-il un moyen d'insérer des clés en tant que chaîne dans un tableau?
Je sais que je peux résoudre mon problème en utilisant un second tableau et congédie les chaînes:
$obj = new stdClass();
$obj->{'0'} = "test";
$array = (array)$obj;
$array2 = array();
foreach ($array as $key => $value) {
$array2[$key] = strtoupper($value);
}
Mais ce serait bien de le faire d'une façon plus belle, la conservation de type de données (et d'éviter les entrées dupliquant en les itérant comme précédemment démontré).
foreach ($ obj comme $ key => valeur $) {$ array [$ key] = strtoupper ($ value); } 'et ignore la laideur de la distribution' (array) 'entièrement. PHP transforme les chaînes numériques en ints pour que les tableaux fonctionnent mieux que ce que vous attendez dans le cas d'ints potentiellement stringifiés, mais les objets portent une telle attente. – cHao
Merci pour ce conseil, ne connaissait pas une chose si simple: o! –