【发布时间】:2012-09-06 21:09:26
【问题描述】:
我在转换后遇到了奇怪的 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);
}
但最好以更美观的方式制作它,保留数据类型(并避免在迭代条目时重复条目,如前所述)。
【问题讨论】:
-
注意,你可以说
$array = array(); foreach ($obj as $key => $value) { $array[$key] = strtoupper($value); }并完全跳过(array)演员表的丑陋。 PHP 将数字字符串转换为整数,以使数组在面对可能字符串化的整数时更像您所期望的那样工作,但对象也有这种期望。 -
感谢您的建议,没想到这么简单:o!
标签: php arrays casting stdclass