2011-12-21 85 views
6

我有一个函数需要一个字符串(干草堆)和一串字符串(针),并且如果至少有一根针是干草堆的子字符串,则返回true。编写它并不需要太多时间或精力,但是我想知道是否有一个PHP函数已经这样做了。在干草堆里发现针,其中针是针阵列

function strstr_array_needle($haystack, $arrayNeedles){ 
    foreach($arrayNeedles as $needle){ 
     if(strstr($haystack, $needle)) return true; 
    } 
    return false;  
} 
+3

变化'的strstr($大海捞针,$针)''来strpos($大海捞针,$针)== FALSE' ... – 2011-12-21 21:49:51

回答

9

只是一个建议...

function array_strpos($haystack, $needles) 
{ 
    foreach($needles as $needle) 
     if(strpos($haystack, $needle) !== false) return true; 
    return false; 
} 
+0

感谢您的回答,使用strpos而不是strstr的任何特定原因? – Drahcir 2011-12-22 01:50:22

+1

@RichardLivingston,你好,你应该,因为strstr返回字符串的一部分(这种行为与PHP5.3不同),而strpos返回位置(如果找到)或假(如果找不到),所以这可能会更快。从文件'如果你只想确定一个特定针是否发生在干草堆里,使用更快,更少的内存密集函数strpos()来代替。“。干杯。 – 2011-12-22 02:37:00

1

我认为最接近的功能将是array_walk_recursive(),但是这需要一个回调。所以使用它可能会比你现有的更复杂。

0

我不完全确定你想要做什么,但我认为in_array()可以帮助你做你正在寻找的东西。

$needleArray = array(1, 2, 3); // the values we want to get from 
$outputArray = array(...); // the values to search for 

foreach ($outputArray as $value) { 
    if (in_array($value, $needleArray)) { 
     // do what you want to do...the $value exists in $needleArray 
    } 
} 
+1

'in_array'只支持相等比较('=='和'===')。 Richard的函数使用子串比较。 – outis 2011-12-26 07:07:54

0

如果你只是试图确定干草堆中存在哪些针,我建议array_intersect函数。从PHP.net网站

<?php 
$array1 = array("a" => "green", "red", "blue"); 
$array2 = array("b" => "green", "yellow", "red"); 
$result = array_intersect($array1, $array2); 
print_r($result); 
?> 

The above example will output: 
Array 
(
    [a] => green 
    [0] => red 
) 

基本上

文档,这将导致在阵列中,显示出现在两个阵列的所有值。在你的情况下,如果找到任何针,你的代码将返回true。下面的代码将使用array_intersect函数执行此操作,但如果这比查尔斯答案更简单,那么这个问题是有争议的。

if(sizeof(array_intersect($hackstack, $arrayNeedles)) > 0) 
    return true; 
else 
    return false; 

再次,我不确定你的代码试图做什么,除了如果任何针存在返回true。如果您可以提供一些您想要达到的内容,可能会有更好的方法。

希望这会有所帮助。

0

没有一个函数的行为如strstr_array_needle(该名称具有误导性;我期望它返回的子字符串为$haystack)。还有其他功能可以用来代替循环,但它们没有优点,需要更多时间。例如:

# iterates over entire array, though stops checking once a match is found 
array_reduce($needles, 
    function($found, $needle) use ($haystack) { 
     return $found || (strpos($haystack, $needle) !== false); 
    }, 
    false); 

# iterates over entire array and checks each needle, even if one is already found 
(bool)array_filter($needles, 
    function($needle) use ($haystack) { 
     return strpos($haystack, $needle) !== false; 
    }); 
0

这里是一个测试和工作职能:

<?php 
function strpos_array($haystack, $needles, $offset = 0) { 
    if (is_array($needles)) { 
     foreach ($needles as $needle) { 
      $pos = strpos_array($haystack, $needle); 
      if ($pos !== false) { 
       return $pos; 
      } 
     } 
     return false; 
    } else { 
     return strpos($haystack, $needles, $offset); 
    } 
}