[PHP-users 15619]unset()の挙動
sumi @ orihime.net
sumi @ orihime.net
2003年 6月 2日 (月) 17:16:16 JST
SUMiです。
WinXP Pro
PHP 4.3.1 CGI版をコマンドラインで起動
上記の環境で下記のスクリプトを実行した時、unset()が妙な動作をします。
---------------------------------------------------------
function PathComp2( $path )
{
$org = explode( '/', $path );
$stack = Array();
$size = sizeof( $org );
for( $i = 0; $i < $size; ++ $i )
{
switch( $org[$i] )
{
case '':
case '.':
break;
case '..':
unset( $stack[sizeof( $stack ) - 1] ); // 挙動不審
//array_pop( $stack );
break;
default:
$stack[] = $org[$i];
//array_push( $stack, $org[$i] );
break;
}
echo( sizeof( $stack ).':'.$org[$i]."\t:".implode( '/', $stack )."\n" );
}
return implode( '/', $stack );
}
$str = "a/c/d/../../e/../f/g";
echo( PathComp2( $str )."\n" );
exit;
---------------------------------------------------------
結果:
1:a :a
2:c :a/c
3:d :a/c/d
2:.. :a/c <-- *1
1:.. :a <-- *2
2:e :a/e
2:.. :a/e <-- *3
3:f :a/e/f
4:g :a/e/f/g
a/e/f/g
上記結果の*3の部分で、unsetされるべき配列の要素がされていないように見え
ます。また、*1および2の部分では正常にunsetされています。
さらに、上記スクリプトのunset部分をarray_popに変更した場合、下記のように
期待した処理がされます。
array_pop使用時:
1:a :a
2:c :a/c
3:d :a/c/d
2:.. :a/c
1:.. :a
2:e :a/e
1:.. :a
2:f :a/f
3:g :a/f/g
a/f/g
手元に他の環境が無いので検証できていないのですが、unsetはこのような動作
をするものなのでしょうか?
PHP-users メーリングリストの案内