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


Using PHP unset() to remove element in an array leads to inconsistent result

代码:

$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[' session ']输出如下:

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。有人知道为什么会这样吗?

PHP中的数组与c中的数组不同。
你的数字索引/键并没有说明数组中的"位置",它"只是"一个键,就像'foo', 'bar'等,如果你从头到尾遍历它,它不会影响数组的顺序。

$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);

那么,你的元素"nada"得到的键值是最高的,因为它是数组中的最后一个元素。
…而unset在数组的中间放置元素不会影响这一点。
所以,你的问题不是关于"$_SESSION有什么特别之处",而是关于如何将元素添加到_SESSION。