如何在不使用任何PHP内置函数的情况下,实现字符串翻转?
我的代码
function strReverse($str){
//将参数强制转为字符串格式
$str = is_string($str) ? $str : $str.'';
//结果初始化
$newStr = '';
//求出字符串的长度
$i = 0;
while($str[$i]){
$i++;
}
//将原字符串倒序赋值给
while($str[$i-1]){
$newStr .= $str[$i-1];
$i--;
}
var_dump($str);
var_dump($newStr);
}
strReverse('abcdefghi');
结果
/opt/wwwroot/test/test7.php:164:string 'abcdefghi' (length=9)
/opt/wwwroot/test/test7.php:165:string 'ihgfedcba' (length=9)
其他方法
尽管用了内置函数,仍有参考价值
1, 内置的strrev()函数;
2, 循环法
/**
* 循环实现对字符串的逆序排列(效率比二分法低)
* @param string $str 源字符串
* @return string 返回逆序后的字符串
*/
function reverse($str='') {
//将参数强制转为字符串格式
$str = is_string($str) ? $str : $str.'';
$len = strlen($str);
//结果字符串初始化
$result = '';
for ($i=$len-1; $i>=0; $i--) {
$result .= $str[$i];
}
return $result;
}
var_dump(reverse(123));
3, 二分法
/**
* 二分法实现字符串倒序排列(效率比循环法高)
* @param string $str 源字符串
* @return string 返回倒序后的字符串
*/
function reverse($str='') {
//将参数强制转为字符串格式
$str = is_string($str) ? $str : $str.'';
$len = strlen($str);
$mid = floor($len/2);
//利用第i位字符和其对称的位字符的位置相加和等于长度-1的特性进行遍历 i+x=$len-1 => x=$len-1-i
for ($i=0; $i<$mid; $i++) {
//将i位字符暂存在中间量中
$temp = $str[$i];
//将倒数i位字符赋值给i位字符
$str[$i] = $str[$len-$i-1];
//将存在中间量中的i位字符赋值给倒数i位字符
$str[$len-$i-1] = $temp;
}
return $str;
}
var_dump(reverse(123));
思考
1, 关键是字符串的长度,用它来对每个字符进行定位;
2, 据说还有更好的方法,因为字符串是一种特殊的数据结构(参考之前的zval文章),现在还没想到;
3, 可以用数组,图形函数做处理;