2012-09-13 2 views
0

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é).

+1

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

+0

Merci pour ce conseil, ne connaissait pas une chose si simple: o! –

Répondre

0

@cHao a trouvé une solution propre et fonctionnelle pour convertir un objet en un tableau sans foreach(). Mon exemple devient:

$array = array(); 
$obj = new stdClass(); 
$obj->{'0'} = "test"; 
foreach ($obj as $key => $value) { 
    $array[$key] = strtoupper($value); 
} 

stdClass est itérable.

Merci! Notez, vous pouvez dire `$ array = array();

1

A partir du manuel PHP:

chaînes contenant des nombres entiers valides seront jetés au type entier. Par exemple. la clé "8" sera en fait stockée sous 8. D'un autre côté, "08" ne sera pas lancé, car il ne s'agit pas d'un nombre entier décimal valide.

Questions connexes