2011-12-21 8 views
6

私は、文字列(haystack)と文字列(針)を取り、少なくとも1つの針が干し草の部分文字列であればtrueを返す関数を持っています。それはそれを書くのに多くの時間や労力を要しませんでしたが、私は既にこれを行うPHP関数があるのだろうかと思います。針が針の配列であるhaystackで針を見つける

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

変更'はstrstr($の干し草、$針) '== false'を... –

答えて

9

だけの提案...

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

あなたの答え、strstrではなくstrposを使用する特定の理由をありがとう? – Drahcir

+1

@RichardLivingston、こんにちは、strstrは文字列の一部を返します(この動作はPHP5.3とは異なります)。strposは位置が見つかった場合や見つからない場合はfalseを返します。 。文書から 'もし特定の針が干草の中で発生しているかどうかだけを知りたいのであれば、代わりに速くてメモリを少なくする関数strpos()を使用してください。乾杯。 –

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'は等価比較(' == 'と' === ')のみをサポートしています。リチャードの関数は部分文字列比較を使用します。 – outis

0

あなただけの干し草の山に存在する針を決定しようとしている場合は、私がarray_intersect機能を示唆しています。

PHP.net Webサイトからドキュメント

<?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関数を使用してこれを行いますが、これはチャールズの答えが議論の余地があるより簡単なものであれば可能です。

また、コードが何をしようとしているのかよく分かりません。針が存在する場合は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

はここでテストされ、作業の機能です:! `strpos($の干し草、$針)へ

<?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); 
    } 
} 
関連する問題