在演员表演后我遇到了一个奇怪的PHP行为。这是代码:
$obj = new stdClass();
$obj->{'0'} = "test";
$array = (array)$obj;
var_dump($array);
此代码将输出:
array(1) { ["0"]=> string(4) "test" }
绝对正常。
现在我添加一些代码:
foreach ($array as $key => $value) {
$array[$key] = strtoupper($value);
}
var_dump($array);
此代码输出:
array(2) {
["0"]=>
string(4) "test"
[0]=>
string(4) "TEST"
}
为什么我的$ key被转换为int?
如果我尝试一个更简单的例子:
$array = array("0" => "test");
foreach ($array as $key => $value) {
$array[$key] = strtoupper($value);
}
var_dump($array);
这将输出:
array(1) { [0]=> string(4) "TEST" }
有人知道为什么我的$ key转换为int?
我试图将我的密钥强制转换为字符串:
$array["{$key}"] = $value;
和
$array[(string)$key] = $value;
但它们是作为int插入的。所以我的问题应该是:有没有办法将键作为字符串插入数组?
我知道我可以通过使用第二个数组并解除字符串来解决我的问题:
$obj = new stdClass();
$obj->{'0'} = "test";
$array = (array)$obj;
$array2 = array();
foreach ($array as $key => $value) {
$array2[$key] = strtoupper($value);
}
但是以更漂亮的方式制作它会很好,保存数据类型(并避免重复条目,同时如前所述迭代它们)。
答案 0 :(得分:1)
从PHP手册:
包含有效整数的字符串将强制转换为整数类型。例如。键“8”实际上将存储在8下。另一方面,“08”将不会被强制转换,因为它不是有效的十进制整数。
答案 1 :(得分:0)
@cHao找到了一个干净且有效的解决方案,可以将对象转换为数组而不需要foreach()。我的例子变成了:
$array = array();
$obj = new stdClass();
$obj->{'0'} = "test";
foreach ($obj as $key => $value) {
$array[$key] = strtoupper($value);
}
stdClass是可迭代的。
谢谢!