0

これは簡単な解決策だと確信しています-私これが関数で終わることを発見し、各文字列を個別にテストする代わりにarray_walk関数を試してみようと思いました。array_walk関数の結果はfalseになると思いましたが、1を返します...すべての文字列をテストし、一致するものが見つからなかった場合はfalseを返すにはどうすればよいですか?ありがとう

class {    
    function endsWith($value,$key,$haystack)
    {
        $length = strlen($value);
        if ($length == 0) {
            return true;
        }

        return (substr($haystack, -$length) === $value);    
    }

    function thing()
    {
        $email = "should@returnfalse.info";
        $arr = array("@test.net","@test.org.uk","@test.co.uk","@test.com");

        echo array_walk($arr,array($this,"endsWith"),$email);
    }
}
4

5 に答える 5

2

の戻り値はarray_walk、コールバックが行うことによって決定されません。アレイ全体のウォークが正常に完了したかどうかのみを通知します。

いくつかの選択肢を検討することをお勧めします。

これにより、一致する要素の数が返され、ブールテストとしても機能しますが、次の場合でもすべての要素が評価されます。

echo count(array_filter($arr,array($this,"endsWith")));

endsWithこれは、一致が検出されるとすぐに要素の評価を停止し、一致がtrueある場合は戻りfalseます。それ以外の場合は次のようになります。

$self = $this;
// cast to int because false is printed as the empty string
echo (int)array_reduce($arr, 
                       function($result, $v) use ($email, $self) {
                          return $result || $self->endsWith($v, null, $email);
                       }, 
                       false);
于 2012-10-18T09:35:50.463 に答える
1

これを試して

class {    
    function thing()
    {
        $email = "should@returnfalse.info";
        $arr   = array("@test.net","@test.org.uk","@test.co.uk","@test.com");

        foreach ($arr as $domain) {
            $length = strlen($value);
            if ($length != 0) {
               if (substr($email, -$length) === $domain) { echo $domain; break; }
            }
        }
    }
}
于 2012-10-18T09:28:04.997 に答える
1

array_walk()配列の要素を繰り返し処理し、true実行できた場合はを返します。(ブール値を文字列にechoキャストします)true'1'array_recude()

$that = $this; // Cannot access $this directly before PHP 5.4
var_dump(
  array_reduce (
    $arr, 
    function($result, item) use ($email, $that) { return $result || $that->endsWith($item, null /* not used anyway */, $email);}, 
    false
  )
);

で追加$keyは使用されず、役に立たないendsWith()

于 2012-10-18T09:28:20.920 に答える
0

すべての値に関数を適用して単一の結果を返す場合は、を使用する必要がありますarray_reduce

于 2012-10-18T09:28:31.977 に答える
0

PHP 5.3以降、無名関数を使用できます。

class {
    function thing()
    {
        $email = "should@returnfalse.info";
        $arr = array("@test.net","@test.org.uk","@test.co.uk","@test.com");
        $match = '';
        $found = false;
        array_walk($arr,function($value) use (&$match, &$found, $email) {
            $length = strlen($value);
            if ($length == 0) {
                $found = true;
                return;
            }

        if (substr($email, -$length) === $value) {
            $match = $value;
            $found = true;
        }
        });
        if ($found) {
            echo 'Found match: ' . $match;
        } else {
            echo 'No match found :(';
        }
    }
}
于 2012-10-18T09:38:58.640 に答える