在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])