在PHP中,unset()调用在什么条件下重置数组索引?

在PHP中,unset()调用在什么条件下重置数组索引?,php,Php,当将unset函数与SimpleXML解码数组结合使用时,我发现了一个奇怪的问题。应用于此类数组的某个索引(为数字索引)上的unset函数似乎会重置数组索引 对我来说,这似乎是一个未记录的行为(或者更像是一个bug)。有人解释过为什么对SimpleXML数组进行“特殊的重新索引”处理吗 这里有一个测试用例来解释它 <?php $a = array( 1, 2, 3, 4 ); echo "Regular array, before unset(\$a[1]): " . print_r( $

当将
unset
函数与SimpleXML解码数组结合使用时,我发现了一个奇怪的问题。应用于此类数组的某个索引(为数字索引)上的
unset
函数似乎会重置数组索引

对我来说,这似乎是一个未记录的行为(或者更像是一个bug)。有人解释过为什么对SimpleXML数组进行“特殊的重新索引”处理吗

这里有一个测试用例来解释它

<?php
$a = array( 1, 2, 3, 4 );
echo "Regular array, before unset(\$a[1]): " . print_r( $a, 1 );
unset( $a[1] );
echo "Regular array, after unset(\$a[1]): " . print_r( $a, 1 );

$xml = simplexml_load_string( <<<EOT
<?xml version="1.0" encoding="UTF-8"?>
<root>
<node>1</node>
<node>2</node>
<node>3</node>
<node>4</node>
<node>5</node>
</root>
EOT
 );

echo "SimpleXML array, before unset(\$a[1]): " . print_r( $xml, 1 );
unset( $xml->node[1] );
echo "SimpleXML array, after unset(\$a[1]): " . print_r( $xml, 1 );
在您的代码中,您可以

unset( $xml->node[1] );
不是

就像你在输出中描述的那样

unset($xml->node[1])您需要,将是:

unset($a[node][1])

因此它是正确的。

如果数组实际上是一个对象而不是一个简单的数组,并且该类定义了一个magic u unset()方法,那么脚本编写者可能会选择故意重新索引元素,以便键保持顺序。。。对于那些喜欢使用
for($i=0;$i
而不是
foreach($nodes作为$node)
在“数组”中循环的程序员来说,这是非常有益的


我认为SimpleXML是用C语言编写的,而不是用PHP编写的,但是当($I=0;$I
编码器使用
node
时,同样的原则可能已经被应用于防止“中断”。

原因是访问
$xml->node
并不能提供实际的数组
$xml->node[1]
返回SimpleXMLElement的一个实例,它有一个神奇的方法
\uu unset
,当您取消设置它时会调用该方法。它不像对数组那样使用PHP的默认unset行为

unset($a[1])
unset($a[node][1])