【问题标题】:Check if string contains any value of an array?检查字符串是否包含数组的任何值?
【发布时间】:2015-02-28 13:40:29
【问题描述】:
$search=array("<",">","!=","<=",">=")
$value="name >= vivek ";

我想检查 $value 是否包含 $search 数组的任何值。我可以找到使用 foreach 和 strpos 函数。不诉诸使用foreach,我还能找到答案吗?如果是这样,请帮我解决这个问题。

【问题讨论】:

标签: php arrays string strpos


【解决方案1】:

我的第一个想法是用 array_walk() 和回调来解决问题,如下:

<?php

$search=array("<",">","!=","<=",">=");
$value = "name >= vivek ";

function test($item, $key, $str)
{
    if( strpos($str, $item) !== FALSE ) {
        echo "$item found in \"$str\"\n";        
    }
}

array_walk($search, 'test', $value);
// output:
> found in "name >= vivek "
>= found in "name >= vivek "

现场演示:http://3v4l.org/6B0WX

虽然这在没有 foreach 循环的情况下解决了问题,但它用“什么”而不是“是/否”响应来回答问题。以下代码直接回答问题,也允许回答“what”,如下:

<?php

function test($x)
{
    $value="name >= vivek ";
    return strpos($value, $x);
}
$search = array("<",">","!=","<=",">=");
$chars = array_filter( $search, "test" );
$count = count($chars);
echo "Are there any search chars? ", $answer = ($count > 0)? 'Yes, as follows: ' : 'No.';
echo join(" ",$chars);

// output:
Are there any search chars? Yes, as follows: > >=

现场演示:http://3v4l.org/WJQ5c

如果响应是否定的,则输出为“否”。后跟一个空格。

与第一个解决方案相比,第二个解决方案的一个关键区别在于,在这种情况下,有一个可以操纵的返回结果。如果数组的元素与字符串中的字符匹配,则 array_filter 将该元素添加到 $chars。新数组的元素计数回答了问题,并且数组本身包含任何匹配项(如果希望显示它们)。

【讨论】:

    【解决方案2】:

    分解$value并将其转换为数组,然后使用php中的array_intersect()函数检查字符串是否不包含数组的值。使用下面的代码

        <?php
        $search=array("<",">","!=","<=",">=");
        $value='name >= vivek ';
        $array = explode(" ",$value);
    
        $p = array_intersect($search,$array);
        $errors = array_filter($p);
    //Check if the string is not empty
        if(!empty($errors)){
        echo "The string contains an value of array";
        }
        else
        {
        echo "The string does not containe the value of an array";
        }
    
        ?>
    

    在这里测试代码http://sandbox.onlinephpfunctions.com/code/7e65faf808de77036a83e185050d0895553d8211

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      这是一个使用 array_reduce 的解决方案:

      <?PHP
      function array_in_string_callback($carry, $item)
      {
          list($str, $found) = $carry;
          echo $str . " - " . $found . " - " . $str . " - " . $item . "<br/>";
          $found |= strpos($str, $item);
          return array($str, (boolean) $found);
      }
      
      function array_in_string($haystack, $needle)
      {
          $retVal = array_reduce($needle, "array_in_string_callback", array($haystack, false));
          return $retVal[1];
      }
      
      $search=array("<",">","!=","<=",">=");
      $value="name >= vivek ";
      
      var_dump(array_in_string($value, $search));
      ?>
      

      【讨论】:

        【解决方案4】:
        $search  = array("<",">","!=","<=",">=");
        $value="name => vivek ";
        foreach($value as $searchval) {
          if(strpos($value,  $searchval) == false)
          {
          echo "match not found";
          }
          else
          {
          echo "match found";
          }
        }
        

        【讨论】:

          【解决方案5】:

          使用 array_map() 和 array_filter()

          function cube($n)
          {
              $value="name => vivek ";
              return strpos($value, $n);
          //return($n * $n * $n);
          }
          
          $a = array("<",">","!=","<=",">=");
          $value="name => vivek ";
          
          $b = array_map("cube", $a);
          print_r($b);
          
          $b = array_filter($b);
          
          print_r($b);
          

          【讨论】:

          • array_filter 接受回调,这里不需要array_map。
          【解决方案6】:

          是的,但这需要您重新构建代码。

          $search = array("<" => 0, ">" => 1,"!=" => 2,"<=" => 3,">=" => 4);
          
          $value = "name => vivek ";
          
          $value = explode(" ", $value);
          
          foreach($value as $val) {
              // search the array in O(1) time
              if(isset($search[$val])) {
                 // found a match
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2013-11-12
            • 2018-10-12
            • 2015-09-08
            • 1970-01-01
            • 1970-01-01
            • 2020-12-01
            • 1970-01-01
            • 2012-08-11
            相关资源
            最近更新 更多