使用PHP反转字符串而不使用循环或内置函数

4

你要如何编写一个简短的PHP函数来反转一个字符串。函数必须满足以下要求:

  • 只能有一个参数
  • 不能使用内置函数“strrev”或“array_reverse”
  • 不能使用像“for”,“foreach”或“while”这样的循环结构。

8
不用手也能写剧本吗? - Elzo Valugi
哈哈。@Linus Kleen 不错。 - Awais Qarni
1
递归函数怎么样?或者算作循环吗? - Benubird
2
@Benubird:通常迭代(循环)是递归的相反。我敢打赌,这就是作业的目的 ;) - KingCrunch
11个回答

13

快速浏览,这些看起来都很长!

function rev($str) {
    return $str?rev(substr($str,1)).$str[0]:'';
}

递归在处理超过100个字符的字符串时显然无法正常工作。


2
function reverseString($string) {
  return shell_exec(sprintf('ruby -e \'puts "%s".reverse\'', preg_replace("/\"/", "\\\"", $string)));
}

不允许在一种语言中使用strrev,那我们就在另一种语言中使用相同的方法吧? :D - KingCrunch
我坚信我的解决方案在规则的字面上是有效的,即使不符合精神。 :D - Chris Heald

2

既然这似乎是一道作业题,那我告诉你如何做,但你需要自己编写代码。 将字符串转换为数组,并使用其中一个带有用户定义排序函数的数组排序函数。


2
“uasort”不是一个内置函数(应该避免使用),而只是一种循环的抽象形式(也应该避免使用)吗?(但实际上,没有任何形式的循环几乎是不可能的) - oezi
@oezi 嗯,这让我想起了一些事情。 - Arvin
问题要求不使用 store 或 array_reverse。并非完全不使用内置函数。是的,usort 是一个循环抽象,但符合问题要求不使用循环结构。 - xzyfer

1

递归解决方案:

function sr( $txt ){
    return $txt[ strlen( $txt ) - 1 ] . ( ( strlen( $txt ) > 1 )?sr( substr( $txt, 0, strlen($txt)-1 ) ):null) ;
}

echo sr( "abc def ghi jklm" );

解释:

return $txt[ strlen( $txt ) - 1 ] // return last byte of string
.                                 // concatenate it with:
(( strlen( $txt ) > 1 ) ?         // if there are more bytes in string
 sr( substr( $txt, 0, strlen( $txt ) - 1 ) // then with reversed string without last letter
 : null );                        // otherwise with null

为了使其能够与零长度字符串一起工作,另一个条件表达式被添加了进去:
return (strlen($txt))? ($txt[ strlen( $txt ) - 1 ] . ( ( strlen( $txt ) > 1 )?sr( substr( $txt, 0, strlen($txt)-1 ) ):null)):"" ;

哇,很重 ^^ 你能格式化它并描述一下吗?想要理解你在做什么 ;) - KingCrunch
codaddict: 你抓住我了!return (strlen($txt)>0)? ($txt[ strlen( $txt ) - 1 ] . ( ( strlen( $txt ) > 1 )?sr( substr( $txt, 0, strlen($txt)-1 ) ):null)):"" ; - mateusza
实际上,在代码高尔夫的范畴中,您不再需要第二个if:return $txt? $txt[ strlen( $txt ) - 1 ] .sr( substr( $txt, 0, strlen($txt)-1 ) ) : ""; 就可以正常工作。 - Benubird
Benubird: '0' 转换为 false :-) - mateusza

1
    <?php
    // Reversed string and Number
    //  For Example :
        $str = "hello world. This is john duvey";
        $number = 123456789;
        $newStr = strrev($str);
        $newBum = strrev($number);

        echo $newStr;
        echo "<br />";
        echo $newBum;

OUTPUT : 
 first : yevud nhoj si sihT .dlrow olleh
 second: 987654321`enter code here`

0

满足您所有的需求,但只能在PHP 5.3或更高版本中使用。使其在其他版本上运行留作课外作业。

function reverse($str) {
        $i=0;
        $j=strlen($str)-1;
start:
        if($i>=$j) {
                goto done;
        }
        $tmp = $str[$j];
        $str[$j--] = $str[$i];
        $str[$i++] = $tmp;
        goto start;
done:
        return $str;
}   

1
自己编写循环与使用循环没有任何区别。 - KingCrunch

0
function reverse_string($string) {
    if($string !== '')
        return substr($string, -1).reverse_string(substr($string, 0, strlen($string)-2));     
}

@mateusasza 把它变成了一个递归函数。 - Arvin

0
一个递归解决方案。感觉你的老师就是在找这样的东西。
function my_strrev ($str) {
  $length = strlen($str);
  switch ($length) {
      case 0: return '';
      case 1: return $str; break;
      case 2: return $str[1] . $str[0];
      default :
          return $str[$length-1] .  my_strrev(substr($str,1,-1)) . $str[0];
          break;
  }
}

它交换第一个和最后一个字母,然后对字符串的其余部分执行相同操作。

更新: 受mateusza启发,我创建了另一种解决方案(很有趣;))

function my_strrev2 ($str) {
  return $str
    ? my_strrev2(substr($str, 1)) . $str[0]
    : '';
}

它的工作方式类似于mateuszas,但这个函数附加第一个字符,而不是前置最后一个字符。


0

在PHP中,不使用任何函数

$reversed = ""; $i = strlen($String) - 1; while ($i >= 0) { $reversed .= $String[$i]; $i--; } echo "反转后:- $reversed";

1
你的回答可以通过提供更多的支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - undefined

-1

我的答案是面向对象编程(OOP)并使用递归。它自己处理递归限制。

class StringReverser
{
    public $reversed_string;
    public function __construct ($string) {
        $original_recursion_limit = ini_get('pcre.recursion_limit');
        $array = str_split($string);
        krsort($array);
        $i = strlen($string);
        ini_set('pcre.recursion_limit', $i+1);
        $this->add2string($string, $i, $array);
        ini_set('pcre.recursion_limit', $original_recursion_limit);
    }

    public function reverse() {
        return $this->reversed_string;
    }

    private function add2string ($s, $i,  $a) {
        if($i) {
            $i--;
            $this->reversed_string .= $a[$i];
            $this->add2string($s, $i,$a, $this->reversed_string);
        }
    }
}


$string =  "Elzo Valugi";
echo $string ."<br>";
$reverser = new StringReverser($string);
echo $reverser->reverse();

能解释一下为什么要投反对票吗?对于一个作业来说,用一个晦涩的Perl一行命令可能不如一个更好的解决方案。 - Elzo Valugi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接