使用PHP unset()删除数组中的元素会导致结果不一致

时间:2015-10-08 17:01:06

标签: php arrays session

此代码:

$argh[0]= "nada";
$argh[1]= "A";
$argh[2]= "B";
$argh[3]= "C";
$argh[4]= "D";

for ($i=0;$i < sizeOf($argh);$i++){
    echo "THE CONTENT AT INDEX ". $i . " IS " . $argh[$i];
    echo "<br>";
}

产生此输出:

THE CONTENT AT INDEX 0 IS NADA
THE CONTENT AT INDEX 1 IS A
THE CONTENT AT INDEX 2 IS B 
THE CONTENT AT INDEX 3 IS C
THE CONTENT AT INDEX 4 IS D

使用,

unset($argh[3]);
$argh = array_values($argh);

然后输出变为

THE CONTENT AT INDEX 0 IS NADA
THE CONTENT AT INDEX 1 IS A
THE CONTENT AT INDEX 2 IS B 
THE CONTENT AT INDEX 3 IS D

这是正确的。我将相同的方法应用于$ _SESSION数组,但效果不同。最初,我的$ _SESSION ['sesh']输出为:

THE CONTENT AT INDEX 0 IS NADA
THE CONTENT AT INDEX 1 IS A
THE CONTENT AT INDEX 2 IS B 
THE CONTENT AT INDEX 3 IS C
THE CONTENT AT INDEX 4 IS D

但执行后

unset($_SESSION['sesh'][3]);
$_SESSION['sesh'] = array_values($_SESSION['sesh']);

输出变为

THE CONTENT AT INDEX 0 IS A
THE CONTENT AT INDEX 1 IS B
THE CONTENT AT INDEX 2 IS D 
THE CONTENT AT INDEX 3 IS NADA

将unset($ x)应用于会话数组似乎导致删除索引$ x处的元素,但由于某种原因,它还将索引0处的值传递给索引$ x - 1.任何人都知道为什么这是发生?

1 个答案:

答案 0 :(得分:2)

PHP中的数组与...中的数组不同。 C.
你的数字索引/关键字没有说明&#34; location&#34;在数组中,它只是&#34;只是&#34;像#foo&#39;,&#39; bar&#39;等关键字,如果你从头到尾遍历它,它不会影响数组的顺序。

e.g。

$argh = array();
$argh[1]= "A";
$argh[2]= "B";
$argh[3]= "C";
$argh[4]= "D";
$argh[0]= "nada";

// foreach iterates the array from start to end    
foreach( $argh as $key=>$value ) {
    echo $key, ' ', $value, "\r\n";
}

打印

1 A
2 B
3 C
4 D
0 nada

即。 一个键0,但其对应的值仍然是数组中的最后一个元素。
array_values()像foreach一样迭代数组,有点像

$values = array(); $cnt = 0;
foreach( $argh as $value ) {
    $values[$cnt++] = $value;
}
print_r($values);

所以,你的元素&#34; nada&#34;获得最高密钥,因为它是数组中的最后一个元素 ...而unset在数组中间的元素并不影响它。
所以,你的问题并不是关于$ _SESSION&#34;&#34;但是关于如何将元素添加到_SESSION。