物体投掷后前臂的奇怪行为


Strange foreach behaviour after an object casting

转换后,我遇到了一个奇怪的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);
}

但是,如果能以一种更美观的方式来创建它,保存数据类型(并在迭代时避免重复条目,如前所述),那就太好了。

来自PHP手册:

包含有效整数的字符串将强制转换为整数类型。例如,密钥"8"实际上将存储在8下。另一方面,"08"不会被强制转换,因为它不是有效的十进制整数。

@cHao找到了一个干净有效的解决方案,可以将对象转换为数组,而不需要foreach()。我的例子变成:

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

stdClass是可迭代的。

谢谢!

相关文章:
  • 没有找到相关文章