【问题标题】:Strange foreach behaviour after an object casting对象转换后的奇怪 foreach 行为
【发布时间】: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


【解决方案1】:

来自 PHP 手册:

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

【讨论】:

    【解决方案2】:

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

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

    stdClass 是可迭代的。

    谢谢!

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 1970-01-01
      • 2018-06-30
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多