[PHP]62進数まで扱えるbase_convert()を作ってみた

勢いだけで用途のあんまり見当たらない62進数まで扱えるbase_convert()を作ってみました。(正確には以前作っていたものをまともにした)
こういう実装の方法が最適なのかよくわからないですし、10進数と62進数間での変換しか試していないので、たぶんバグがあります。バグを見つけたら、コメントで知らせてください。がんばって修正してみます

function super_base_convert($number, $frombase, $tobase) {
	settype($number, 'string');
	if($tobase==1 || $frombase==1 || $tobase>62 || $frombase>62) {
		return false;
	} elseif((2<=$tobase && $tobase<=36) && (2<=$frombase && $frombase<=36)) {
		return base_convert($number, $frombase, $tobase);
	} elseif($frombase==10) {
		$T_&#91;0&#93; = $number;
		for($i = 0; ; $i++) {
			$T_&#91;$i+1&#93; = floor($T_&#91;$i&#93;/$tobase);
			$c&#91;$i&#93; = $T_&#91;$i&#93; % $tobase;
			if($T_&#91;$i+1&#93;==0) {
				$r = $i;
				break;
			}
		}
		$variant = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
				'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
				'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
		$converted = '';
		for($i = count($c)-1; $i>=0; $i--) {
			$converted .= $variant[$c[$i]];
		}
		return $converted;
	} elseif($tobase==10) {
		$variant = array('0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7',
				'8' => '8', '9' => '9', 'a' => '10', 'b' => '11', 'c' => '12', 'd' => '13', 'e' => '14', 'f' => '15',
				'g' => '16', 'h' => '17', 'i' => '18', 'j' => '19', 'k' => '20', 'l' => '21', 'm' => '22', 'n' => '23',
				'o' => '24', 'p' => '25', 'q' => '26', 'r' => '27', 's' => '28', 't' => '29', 'u' => '30', 'v' => '31',
				'w' => '32', 'x' => '33', 'y' => '34', 'z' => '35', 'A' => '36', 'B' => '37', 'C' => '38', 'D' => '39',
				'E' => '40', 'F' => '41', 'G' => '42', 'H' => '43', 'I' => '44', 'J' => '45', 'K' => '46', 'L' => '47',
				'M' => '48', 'N' => '49', 'O' => '50', 'P' => '51', 'Q' => '52', 'R' => '53', 'S' => '54', 'T' => '55',
				'U' => '56', 'V' => '57', 'W' => '58', 'X' => '59', 'Y' => '60', 'Z' => '61');
		$converted = 0;
		for($i = 0; $i&lt;strlen($number); $i++) {
			$converted += $variant[$number{$i}]*pow($frombase, strlen($number)-1-$i).' '.$i.'\n';
		}
		return $converted;
	} else {
		return super_base_convert(super_base_convert($number, $frombase, 10), 10, $tobase);
	}
}

コメントを残す