[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 メーリングリストの案内