【问题标题】:PHP - Check if all the elements of an array are in a stringPHP - 检查数组的所有元素是否都在字符串中
【发布时间】:2014-12-31 20:46:59
【问题描述】:

我有一个数组$my_array,其中包含n 元素和一个字符串$my_string。我想检查$my_array 的所有元素是否都在$my_string 中。只要它们都在那里,它们在字符串中的顺序并不重要。我正在寻找最有效的解决方案来获得TRUE,前提是所有元素都存在。

正确:

$my_array = array("big", "blue", "sky", "dog"); 
$my_string = "my big dog loves the blue sky"; 

错误:

$my_array = array("big", "blue", "sky", "dog"); 
$my_string = "the big blue sky"; 

【问题讨论】:

  • 蓝狗怎么样?
  • 我可以循环执行,我只是想知道php中是否有内置函数可以这样做
  • 我会说循环效果最好。
  • @LaGuille:你可以试试array_diffarray_intersect,如果你做类似explode(' ', $my_string) 的事情。
  • 您想要准确的单词,包括标点符号吗?正如我指出的那样,它会有所作为(双关语)。

标签: php arrays string


【解决方案1】:

给你,不要害怕数组。

  $my_array = array("big", "blue", "sky", "dog");
  $my_string = "my big dog loves the blue sky"

  function arrayInString( array $my_array, $my_string ){
    $my_string = explode(' ', $my_string);
    // difference return all elements of array one not in array two
    $diff = array_diff($my_array, $my_string);
    if(empty( $diff )){
        //if there is no difference there are no elements not in the string.
        return true;
    }
    return false;
 }

没有循环的乐趣!

如果有标点符号可以使用

preg_split('/^\w/', $my_string );

而不是explode

【讨论】:

  • @Hobbes - 谢谢。其他人也有类似的建议。
【解决方案2】:

我能想到的两种方法。第一种方法很棒,如果您确定您将始终能够拆分为给定的字符。它简短、甜蜜、简单。利用array_dif和一个简单的explode

function isArrayInString($str, $ara, $splitter=" ") {
    $ret = array_diff($ara, explode($splitter, $str));
    return empty($ret);
}

但是,这似乎不是很动态,并且会根据“拆分”字符串来限制您。一种更简单、可能更好的方法是循环遍历您的数组并使用 strpos 确保该数组的每个值都存在于字符串中。

function isArrayInString($str, $ara, $splitter=" ") {
    foreach($ara as $v) if (strpos($str , $v) === false) return FALSE;
    return $TRUE;
}

类似:

$myArray = array("big", "blue", "sky", "dog"); 
$myString = "my big dog loves the blue sky"; 
echo isArrayInString($myString, $myArray);

将输出TRUE

虽然类似:

$myArray = array("big", "blue", "sky", "dog"); 
$myString = "the big blue sky";
echo isArrayInString($myString, $myArray);

将输出FALSE

【讨论】:

  • 第二个示例的最大优势是使用标点符号时。只是想我会指出这一点,但是 strpos 可能会找到部分字符串匹配。例如狗中的狗,这可能是也可能不是预期的结果。
  • 我意识到这就是我前段时间删除该评论的原因。
【解决方案3】:

这应该适合你:

<?php

    $my_array = array("big", "blue", "sky", "dog"); 
    $my_string = "my big dog loves the blue sky"; 

    $result = 0;

    foreach($my_array as $value) {
        if (strpos($my_string, $value) !== false) 
            $result+=1; 
    }

    if($result == count($my_array))
        echo "true";
    else
        echo "false";

?>

输出:

true

【讨论】:

  • strpos 会找到部分匹配项,所以“我的大狗爱蓝天”与“mybigdoglovesthebluesky”是否相同,或者我们正在寻找单词。 “狗”和“狗”一样吗
【解决方案4】:
function allInString($str, $arr) {
    foreach ($arr as $a) {
       if (strpos($str, $a) === false) {
           return false;
       }
    }
    return true;
}

【讨论】:

  • 如果你也解释一下你在做什么而不只是复制和粘贴一些代码,这将有所帮助
【解决方案5】:
$my_array = array("big", "blue", "sky", "dog");
$my_string = "my big dog loves the blue sky";
$inArray = true;

foreach($my_array as $field)
{
    if(!strpos($my_string,$field))
    {echo "$field is not";
        return false;}
}
return true;

【讨论】:

  • 您可以删除$inArray = true; 行。它什么都不做。
  • 是的,你可能是对的 - 我是一个老人,而且回到过去 - 保持完整是明智的 - 旧习惯。好电话。
  • @terary 我会离开它,即使在今天的“一天”,您也会遇到未定义的变量错误,设置默认值永远不会有坏处。
  • @ArtisiticPhoenix 但它甚至没有在代码中的其他任何地方使用,而是在这里。它完全没有任何作用。
猜你喜欢
  • 2015-01-08
  • 1970-01-01
  • 2016-01-17
  • 2018-06-24
  • 2022-07-30
  • 1970-01-01
  • 2015-10-03
  • 2018-06-08
  • 2014-09-24
相关资源
最近更新 更多