3

我之前有过这个问题,并得出结论这是 5.2.5 中的一个错误。好吧,至少对我来说,它在 5.2.6 中仍然存在问题:

请让我知道它是否损坏或对您有用:

$obj = new stdClass();
$obj->{"foo"} = "bar";
$obj->{"0"} = "zero";
$arr = (array)$obj;

//foo -- bar
//0 --    {error: undefined index}
foreach ($arr as $key=>$value){
    echo "$key -- " . $arr[$key] . "\n";
}

从 stdClass 转换后,有什么方法可以“修复”数组?

4

3 回答 3

2

对我来说绝对是一个错误(PHP 5.2.6)。

您可以像这样修复数组:

$arr = array_combine(array_keys($arr), array_values($arr));

它已在此错误报告中报告,但被标记为虚假......文档说:

键是成员变量名称,有一些值得注意的例外:整数属性不可访问;

于 2008-11-25T09:08:03.317 回答
1

一些实验表明 phps 自己的函数不会持续这种模糊性。

function noopa( $a ){ return $a; }
$arr = array_map('noopa', $arr ); 
$arr[0]; # no error! 

实际上,这只是创建了数组的副本,并且在复制期间进行了修复。

最终,它是一个全面的设计失败,尝试以您认为它在具有混合数字和字符串键的数组上工作的方式使用 array_merge?

所有编号的元素都被复制,有些被重新编号,即使有些只是恰好是字符串封装的数字,因此,有许多 array_merge 的自制实现只是为了解决这个问题。

回到当 php 试图克隆 perl 并失败时,他们没有掌握数组和哈希是不同概念的概念,而是将它们组合成一个通用保护伞。好样的!。

对于他们的下一个技巧,他们设法打破命名空间分隔符,因为某些其他语言由于某种原因没有遇到过的技术问题。

于 2008-11-25T09:17:22.317 回答
0

谢谢RoBorg ..我刚刚也发现了:)

这是另一个解决方案,不确定它是否更快:

unserialize(serialize($arr));
于 2008-11-25T09:10:57.007 回答