1

重複の可能性:
javascript: recursive anonymous function?
匿名再帰 PHP 関数

私は疑問に思っていました...無名関数で再帰を行うことは可能ですか?

1 つの例を次に示します。数字とスペースのみを含む 6 文字の長い文字列を取得する必要があります。唯一の規則は、スペースで開始または終了できないことです。それを確認し、それが発生した場合は、同じ匿名の関数で再帰を呼び出すだけです。どうやって!?

function() {

    $chars   = range(0, 9);
    $chars[] = ' ';
    length   = 6;
    $count   = count($chars);

    $string = '';
    for ($i = 0; $i < $length; ++$i) {

        $string .= $chars[mt_rand(0, $count - 1)];

    }

    $string = trim($string);

    if (strlen($string) !== $length) { // There were spaces in front or end of the string. Shit!

        // Do recursion.

    }

    return $string;

}
4

4 に答える 4

14

はい、そうですが、少しトリッキーなのでお勧めしません;)

最初の可能性:

<?php
$some_var1="1";
$some_var2="2";
function($param1, $param2) use ($some_var1, $some_var2)
{
    call_user_func(__FUNCTION__, $other_param1, $other_param2);
}
?>

別のもの:

<?php 
$recursive = function () use (&$recursive){ 
    // The function is now available as $recursive 
} 
?> 

http://php.net/からの例

于 2011-08-14T08:34:24.227 に答える
2

答えは複雑ですが、不可能ではありません。理解するのに数分かかりました。まず、$combinator() というユーティリティ関数を定義する必要があります。

あなたの問題の解決策:

$combinator(
function($self) { function() use (&$self) {
    $chars   = range(0, 9);
    $chars[] = ' ';
    length   = 6;
    $count   = count($chars);

    $string = '';
    for ($i = 0; $i < $length; ++$i) {
        $string .= $chars[mt_rand(0, $count - 1)];
    }
    $string = trim($string);

    if (strlen($string) !== $length) {
        return $self();
    }
    return $string;
} }
);

$combinator() の定義:

$combinator = function($principle)
{
  (function($transept) use (&$principle)
  {
    $principle(
      function($arguments) use (&$transept)
      {
        call_user_func_array($transept($transept), $arguments));
      }
    );
  })
  (function($transept) use (&$principle)
  {
    $principle(
      function($arguments)
      {
        call_user_func_array($transept($transept), $arguments);
      }
    );
  });
}
于 2011-08-14T10:34:16.990 に答える
1

同じことを行うためのより健全な方法。必要なループも 1 つだけです。

$chars = array_merge(range(0, 9), array(' '));

$string = mt_rand(0, 9);
for ($i = 1; $i <= 4; $i++) {
    $string .= $chars[array_rand($chars)];
}
$string .= mt_rand(0, 9);

ただし、実際の質問を回避して申し訳ありません。

于 2011-08-14T08:31:53.473 に答える
0

Gotoを使う

function() {
    start:
    $chars   = range(0, 9);
    $chars[] = ' ';
    length   = 6;
    $count   = count($chars);

    $string = '';
    for ($i = 0; $i < $length; ++$i) {

        $string .= $chars[mt_rand(0, $count - 1)];

    }

    $string = trim($string);

    if (strlen($string) !== $length) { // There were spaces in front or end of the string. Shit!

        goto start;

    }

    return $string;

しかし、goto を使用するのは最善の方法ではありません。

于 2011-08-14T08:30:23.600 に答える