2011-12-21 25 views
6

Tôi có một hàm có chuỗi (haystack) và một chuỗi các chuỗi (kim) và trả về true nếu ít nhất một kim là một chuỗi con của haystack. Nó không mất nhiều thời gian hoặc công sức để viết nó, nhưng tôi tự hỏi nếu có một hàm PHP đã thực hiện điều này.Tìm kim trong haystack, nơi kim là mảng kim

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

thay đổi 'strstr ($ đống cỏ khô, $ kim) 'với' strpos ($ đống cỏ khô, $ kim) false' ... –

Trả lời

9

chỉ là một gợi ý ...

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

Cảm ơn câu trả lời của bạn, bất kỳ lý do cụ thể nào để sử dụng strpos thay vì strstr? – Drahcir

+1

@RichardLivingston, Xin chào, bạn nên, bởi vì strstr trả về một phần của chuỗi (còn hành vi này khác với PHP5.3), trong khi strpos trả về vị trí (nếu tìm thấy) hoặc false (nếu không tìm thấy), do đó có thể nhanh hơn . Từ các tài liệu 'Nếu bạn chỉ muốn xác định xem một kim cụ thể có xảy ra trong haystack hay không, hãy sử dụng hàm strpos() thay thế nhanh hơn và ít bộ nhớ hơn. Chúc mừng. –

1

Tôi nghĩ rằng chức năng gần nhất sẽ là array_walk_recursive(), nhưng điều đó đòi hỏi một callback. Vì vậy, sử dụng nó có lẽ sẽ phức tạp hơn những gì bạn đã có.

0

Tôi không chắc chắn bạn muốn làm gì nhưng tôi nghĩ in_array() có thể giúp bạn thực hiện những gì bạn đang tìm kiếm.

$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' chỉ hỗ trợ so sánh bình đẳng (' == 'và' === '). Chức năng của Richard sử dụng so sánh chuỗi con. – outis

0

Nếu bạn chỉ cố gắng xác định kim nào tồn tại trong haystack, tôi đề xuất hàm array_intersect.

Tài liệu từ trang web 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 
) 

Về cơ bản, điều này sẽ dẫn đến một mảng cho thấy tất cả các giá trị xuất hiện trong cả hai mảng. Trong trường hợp của bạn, mã của bạn sẽ trở lại đúng nếu có bất kỳ kim nào được tìm thấy. Đoạn mã sau sẽ làm điều này bằng cách sử dụng hàm array_intersect, mặc dù nếu điều này đơn giản hơn câu trả lời của Charles là có thể gây tranh cãi.

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

Một lần nữa, tôi không chắc chính xác mã của bạn đang cố gắng làm gì, ngoài trả lại đúng nếu có kim. Nếu bạn có thể cung cấp một số bối cảnh về những gì bạn muốn đạt được, có thể có một cách tốt hơn.

Hy vọng điều này sẽ hữu ích.

0

Không có chức năng duy nhất nào hoạt động như strstr_array_needle (tên gây hiểu lầm; tôi hy vọng nó sẽ trả lại chuỗi con $haystack). Có các chức năng khác có thể được sử dụng thay vì một vòng lặp, nhưng chúng không có lợi ích và mất nhiều thời gian hơn. Ví dụ:

# 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

Đây là một chức năng kiểm tra và làm việc:! ==

<?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); 
    } 
} 
Các vấn đề liên quan