2

PHPにはin_array、指定された値が配列に存在するかどうかをチェックする関数があります。私はそれの逆をしたいと思います。私は文字列のセットを持っています:

$words = array("hello", "world");

そして、与えられた文字列にこれらの単語が含まれているかどうかを、パラメータを指定するかどうかで確認したいと思いallますany

$string = "Hello, World!";
$second = "Hello and Welcome!";
in_string($words, $string, "all");
in_string($words, $string, "any");

私が今持っているのは、を使用することstripos()です。使いたくないregex

現在のコード:

<?php
    /**
    * Checks if the given words is found in a string or not.
    * 
    * @param Array $words The array of words to be given.
    * @param String $string The string to be checked on.
    * @param String $option all - should have all the words in the array. any - should have any of the words in the array
    * @return boolean True, if found, False if not found, depending on the $option
    */
    function in_string ($words, $string, $option)
    {
        if ($option == "all")
            foreach ($words as $value)
                $isFound = $isFound && (stripos($string, $value) || false);
        else
            foreach ($words as $value)
                $isFound = $isFound || (stripos($string, $value) || false);
        return $isFound;
    }
?>

私の質問は、これを改善できるかということです。何かご意見は?


更新#1:現在のコードが更新されました:

/**
* Checks if the given words is found in a string or not.
* 
* @param Array $words The array of words to be given.
* @param String $string The string to be checked on.
* @param String $option all - should have all the words in the array. any - should have any of the words in the array
* @return boolean True, if found, False if not found, depending on the $option
*/
function in_string ($words, $string, $option)
{
    if ($option == "all")
    {
        $isFound = true;
        foreach ($words as $value)
            $isFound = $isFound && (stripos($string, $value) !== false);
        return $isFound;
    }
    else
    {
        $isFound = true;
        foreach ($words as $value)
            if (stripos($string, $value) !== false) return true;
        return $isFound;
    }
}

これで、関数は期待どおりに機能しています。foreach()しかし、私は部分的にそしてすべてにおいてより良いパフォーマンスを必要としています。改善のために何か可能なことはありますか?


アップデート#2:改善点が追加されました

<?php
    /**
    * Checks if the given words is found in a string or not.
    * 
    * @param Array $words The array of words to be given.
    * @param String $string The string to be checked on.
    * @param String $option all - should have all the words in the array. any - should have any of the words in the array
    * @return boolean True, if found, False if not found, depending on the $option
    */
    function in_string ($words, $string, $option)
    {
        if ($option == "all")
        {
            foreach ($words as $value)
                if (stripos($string, $value) === false)
                    return false;
            return true;
        }
        else
        {
            foreach ($words as $value)
                if (stripos($string, $value) !== false)
                    return true;
            return false;
        }
    }
?>
4

5 に答える 5

5
<?php
/**
* Checks if the given words is found in a string or not.
* 
* @param Array $words The array of words to be given.
* @param String $string The string to be checked on.
* @param String $option all - should have all the words in the array. any - should have any of the words in the array
* @return boolean True, if found, False if not found, depending on the $option
*/
function in_string ($words, $string, $option)
{
    if ($option == "all") {
        $isFound = true;
        foreach ($words as $value) {
            $isFound = $isFound && (stripos($string, $value) !== false); // returns boolean false if nothing is found, not 0
            if (!$isFound) break; // if a word wasn't found, there is no need to continue
        }
    } else {
        $isFound = false;
        foreach ($words as $value) {
            $isFound = $isFound || (stripos($string, $value) !== false);
            if ($isFound) break; // if a word was found, there is no need to continue
        }
    }
    return $isFound;
}
?>

私の下にいる人と同じコードですが、休憩があります。追加した。どうやらコメントするのに十分な担当者がいません

于 2012-11-27T07:49:35.693 に答える
1

ロジックを分割すると、各関数のコードが単純になり、パフォーマンスが向上し、各関数が具体的なタスクを解決します。

<?php
function in_string_all ($string, $words) {
    $isFound = true;
    foreach ($words as $value) {
        $isFound = $isFound && stripos($string, $value) !== false;
        if (!$isFound) 
            break;
    }
    return $isFound;
}

function in_string_any ($string, $words) {
    foreach ($words as $value) 
        if (stripos($string, $value) !== false)
            return true;
    return false;
}
?>
于 2012-11-27T08:39:56.237 に答える
1

strposの使用は、部分的な文字列の一致に対してtrueを返すため、機能しません。「insersection」で「in」を検索する例では、誤検知が発生します。これは、ターゲット文字列から単語を抽出し、配列間の交差を作成する別の方法です。

/**
 * Checks if a array of given words is found in a string.
 * 
 * @param array $words The array of words to be given.
 * @param string $string The string to be checked on.
 * @param boolean $exactMatch true - should have all the words in the array. false - should have any of the words in the array
 * @param boolean $insensitive true to compare insensitive. false to compare sensitive
 * @return boolean True, if found, False if not found, depending on the $option
 */
private function arrayInString (array $words, $string, $exactMatch = true, $insensitive = true)
{
    $stringArr = explode(" ", preg_replace('/[^a-z0-9]+/i', ' ', $string));
    if ($insensitive) {
        $words = array_map('strtolower', $words);
        $stringArr = array_map('strtolower', $stringArr);
    }
    $intersectionCount = count(array_intersect($words, $stringArr));
    if ($exactMatch && $intersectionCount == count($words)) {
        return true;
    }
    if (!$exactMatch && $intersectionCount > 0) {
        return true;
    }

    return false;
}
于 2018-03-08T15:17:52.250 に答える
0

strpos()代わりに、substr()またはstrstr()存在する単語だけを気にするために使用するので、何も解析する必要はありません。ドキュメントによると、それはより高速です。

マニュアルから:

特定の針が干し草の山の中で発生するかどうかだけを判断したい場合は、代わりに、より高速でメモリ消費の少ない関数strpos()を使用してください。

于 2012-11-27T07:24:07.687 に答える
0

初期$isFoundstripos()して大文字と小文字を区別しない検索に使用し、0ではなくがstripos()返されることを確認する必要がありますfalse(0はで$string始まることを意味します$value

function in_string ($words, $string, $option)
{
if ($option == "all") {
    $isFound = true;
    foreach ($words as $value) {
        $isFound = $isFound && (stripos($string, $value) !== false);
    }
} else {
    $isFound = false;
    foreach ($words as $value) {
        $isFound = $isFound || (stripos($string, $value) !== false);
    }
}
return $isFound;
}
于 2012-11-27T07:43:23.917 に答える