0

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

但是如果以一种更漂亮的方式来制作它会很好,保留数据类型(并避免在迭代条目时重复条目,如前所述)。

4

2 回答 2

1

来自 PHP 手册:

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

于 2012-09-13T17:59:21.527 回答
0

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

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

stdClass 是可迭代的。

谢谢!

于 2012-09-13T18:43:19.710 回答