マルチバイト対応版pathinfo

ないらしい。バイトで使いたかったから書いた。とりあえずunix系のみ対応。

/**
 * マルチバイト文字列対応pathinfo
 */
function mb_pathinfo()
{
    $info = array(
        'dirname' => '',
        'filename' => '',
        'basename' => '',
        'extension' => '',
        );

    $num = func_num_args();
    if ($num == 0) { return $info; }
    $args = func_get_args();

    // path
    $path = array_shift($args);

    // dir and base
    while(1) {
        $lastSlashPos = mb_strrpos($path, "/");
        if ($lastSlashPos === FALSE) {
            $info['basename'] = $path;
            break;
        }
        else if ($lastSlashPos == 0){
            $info['dirname'] = mb_substr($path, 0, 1);
            $info['basename'] = mb_substr($path,1);
            break;
        }
        else if ($lastSlashPos == (mb_strlen($path) - 1)){
            $path = mb_substr($path,0, $lastSlashPos);
        }
        else {
            $info['dirname'] = mb_substr($path, 0, $lastSlashPos);
            $info['basename'] = mb_substr($path,$lastSlashPos + 1);
            break;
        }
    }

    // file and extension
    $lastDotPos = mb_strrpos($info['basename'], ".");
    if ($lastDotPos === FALSE) {
        $info['filename'] = $info['basename'];
    } else {
        $info['filename'] = mb_substr($info['basename'],0, $lastDotPos);
        $info['extension'] = mb_substr($info['basename'], $lastDotPos + 1);
    }

    // default
    if ($num == 1) { return $info; }

    // output
    $result = array();
    foreach($args as $value) {
        switch($value) {
          case PATHINFO_DIRNAME:
            $result['dirname'] = $info['dirname'];
            break;
          case PATHINFO_BASENAME:
            $result['basename'] = $info['basename'];
            break;
          case PATHINFO_EXTENSION:
            $result['extension'] = $info['extension'];
            break;
          case PATHINFO_FILENAME:
            $result['filename'] = $info['filename'];
            break;
        }
    }
    if (count($result) == 1) {
        return array_shift($result);
    } else {
        return $result;
    }
}