स्ट्रैप में सुइयों के रूप में एक सरणी का उपयोग करना


91

strposस्ट्रिंग खोजते समय आप सुइयों की एक सरणी के लिए कैसे उपयोग करते हैं ? उदाहरण के लिए:

$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';

if(strpos($string, $find_letters) !== false)
{
    echo 'All the letters are found in the string!';
}

क्योंकि इस का उपयोग करते समय, यह काम नहीं करेगा, अगर ऐसा कुछ होता तो अच्छा होगा

जवाबों:


138

@ एक अद्यतन स्निपेट http://www.php.net/manual/en/function.strpos.php#107351 से दें

function strposa($haystack, $needles=array(), $offset=0) {
        $chr = array();
        foreach($needles as $needle) {
                $res = strpos($haystack, $needle, $offset);
                if ($res !== false) $chr[$needle] = $res;
        }
        if(empty($chr)) return false;
        return min($chr);
}

कैसे इस्तेमाल करे:

$string = 'Whis string contains word "cheese" and "tea".';
$array  = array('burger', 'melon', 'cheese', 'milk');

if (strposa($string, $array, 1)) {
    echo 'true';
} else {
    echo 'false';
}

की trueवजह से वापस आ जाएगा array "cheese"

अद्यतन: सुइयों के पहले पाए जाने पर स्टॉप के साथ बेहतर कोड:

function strposa($haystack, $needle, $offset=0) {
    if(!is_array($needle)) $needle = array($needle);
    foreach($needle as $query) {
        if(strpos($haystack, $query, $offset) !== false) return true; // stop on first true result
    }
    return false;
}
$string = 'Whis string contains word "cheese" and "tea".';
$array  = array('burger', 'melon', 'cheese', 'milk');
var_dump(strposa($string, $array)); // will return true, since "cheese" has been found

1
@ अरनॉड, आपका सुझाया हुआ अमल क्या है?
बिन्यामीन

5
मुझे यकीन नहीं है, लेकिन शायद हम $ ऑफसेट से स्ट्रिंग में आगे बढ़ सकते हैं, और सुइयों के पहले पाए जाने पर रुक सकते हैं। "A" से भरे एक बड़े पाठ के बारे में सोचें। $ सुई लेना = [ए, बी]। आपका फ़ंक्शन strposaसभी पाठ के माध्यम से चलेगा, लेकिन यह आवश्यक नहीं है! क्या मैं समझ पा रहा हूँ?
अरनौद

धन्यवाद @Arnaud फीचर सुझाव के लिए! मैं आपके सुझाव के महत्व से पूरी तरह सहमत हूँ और बेहतर कोड उदाहरण के साथ अपने उत्तर को अद्यतन किया है।
बिन्यामीन

यह बिल्कुल वैसा नहीं है जैसा मैं कहना चाहता था, क्योंकि आपके नए कार्य के साथ $ सुई = [बी] की अभी तक कोई समस्या नहीं है, और इसके अलावा फ़ंक्शन अब पहली घटना की स्थिति नहीं देता है। चलिए मैं थोड़ा और समझाता हूं। मान लें कि स्ट्रिंग "ABCDEF" है, और सुई C और F हैं। हम क्या कर सकते हैं: स्ट्रिंग के माध्यम से चल रहा है: A, B ... C! हम सी का पता लगाते हैं, इसलिए हम यहां रुकते हैं और हम एक सुई की पहली घटना की स्थिति वापस कर सकते हैं, जो 2. है। यह एकल-वर्ण स्ट्रिंग्स से अधिक के साथ काम कर सकता है, लेकिन मैंने सटीक कार्यान्वयन के बारे में नहीं सोचा है।
अरनौद

1
मैंने बदलकर कोड में सुधार किया foreach($needle as $k => $query) { if(strpos($haystack, $query, $offset) !== false) return $k; }, इसलिए यह आगे की हैंडलिंग के लिए मिलान आइटम की कुंजी देता है।
जेम्स कैमरन

53

str_replace काफी तेज है।

$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';
$match = (str_replace($find_letters, '', $string) != $string);

सिंटैक्स त्रुटि: 1 # 3 पर बहुत अधिक क्लोजिंग ब्रैकेट (मैं इसे> वर्ण वर्ण संपादित आवश्यकता के कारण ऊपर दिए गए कोड में सीधे सही नहीं कर सकता;)
richey

1
उफ़, वो कफ़ बंद था। अभी तय किया है। सिर के लिए चीयर्स!
लियोन

7
सबसे बड़े समाधानों में से एक!
andys

18

नीचे दिए गए कोड न केवल यह दिखाते हैं कि यह कैसे करना है, बल्कि इसे आगे बढ़ने वाले फ़ंक्शन का उपयोग करने में भी आसान बनाता है। यह "जेस्दा" द्वारा लिखा गया था। (मैंने इसे ऑनलाइन पाया)

PHP कोड:

<?php
/* strpos that takes an array of values to match against a string
 * note the stupid argument order (to match strpos)
 */
function strpos_arr($haystack, $needle) {
    if(!is_array($needle)) $needle = array($needle);
    foreach($needle as $what) {
        if(($pos = strpos($haystack, $what))!==false) return $pos;
    }
    return false;
}
?>

उपयोग:

$needle = array('something','nothing');
$haystack = "This is something";
echo strpos_arr($haystack, $needle); // Will echo True

$haystack = "This isn't anything";
echo strpos_arr($haystack, $needle); // Will echo False 

मेरा मानना ​​है कि यह केवल 1 स्थिति को वापस पाता है। यह कैसे घास में हर सुई की स्थिति को वापस करने के लिए tweak करने के लिए कोई सुझाव?
चाए कूपर

7

आप सरणी के माध्यम से पुनरावृत्ति कर सकते हैं और strposरिटर्न होने पर "ध्वज" मान सेट कर सकते हैं false

$flag = false;
foreach ($find_letters as $letter)
{
    if (strpos($string, $letter) === false)
    {
        $flag = true;
    }
}

फिर के मूल्य की जाँच करें $flag


6
क्या यह नहीं होना चाहिए !== flase?
जो हुआंग

यह होना चाहिए! == झूठा। जब तक आप अपने झंडे को सच करने के लिए सही नहीं तोड़ देते। और फिर झंडे को चेतावनी के रूप में व्याख्या करना होगा कि एक सुई धड़ल्ले में नहीं है। इसका मतलब है कि आप जो हासिल करने की कोशिश कर रहे हैं वह यह जांचने के लिए है कि आपकी सभी सुइयां धड़ल्ले से हैं। जो सवाल नहीं है। तो हाँ। ! == असत्य
केविन गगनोन

5

यदि आप केवल यह जांचना चाहते हैं कि कुछ पात्र वास्तव में स्ट्रिंग में हैं या नहीं, तो स्ट्रेटोक का उपयोग करें :

$string = 'abcdefg';
if (strtok($string, 'acd') === $string) {
    // not found
} else {
    // found
}

अतुल्य उत्तर - एकाधिक स्ट्रैप (), जैसे, (स्ट्रैप ($ स्ट्रिंग, "a"! =!) = False && strpos ($ string, "c")! ==> false && strpos ($ string) की तुलना में तेजी से निष्पादन को MUCH करें। d ")! == मिथ्या)
द वन एंड ओनली केमिस्ट्रीब्लो

5

प्रश्न, क्या प्रदान किया गया उदाहरण केवल एक "उदाहरण" है या ठीक वही है जो आप खोज रहे हैं? यहाँ कई मिश्रित उत्तर हैं, और मुझे स्वीकार नहीं की जटिलता को समझना चाहिए।

यह जानने के लिए कि क्या सुइयों की सरणी की कोई सामग्री स्ट्रिंग में मौजूद है, और जल्दी से सही या गलत लौटे:

$string = 'abcdefg';

if(str_replace(array('a', 'c', 'd'), '', $string) != $string){
    echo 'at least one of the needles where found';
};

यदि हां, तो इसके लिए @Leon क्रेडिट दें ।

यह जानने के लिए कि क्या सुइयों की सरणी के सभी मान स्ट्रिंग में मौजूद हैं , जैसे कि इस मामले में, सभी तीन 'a', 'b'और 'c'जरूरी मौजूद होंगे, जैसे कि उल्लेख अपने "उदाहरण के लिए" का करते हैं।

गूंज 'सभी पत्र स्ट्रिंग में पाए जाते हैं!'

यहाँ कई उत्तर उस संदर्भ से बाहर हैं, लेकिन मुझे संदेह है कि प्रश्न का अंत जैसा कि आपने हल किया था। उदा। स्वीकृत उत्तर की एक सुई है

$array  = array('burger', 'melon', 'cheese', 'milk');

क्या हो अगर उन सभी शब्दों को स्ट्रिंग में पाया जाना चाहिए?

फिर आप "not accepted answers"इस पृष्ठ पर कुछ आज़माएँ ।


यह मेरे लिए पूरी तरह से काम कर रहा था क्योंकि मैं अपनी सरणी देख रहा था जिसमें उप-तार थे। मुझे "% $ स्ट्रिंग%" जैसे
मौरिस

4

यह अभिव्यक्ति सभी पत्रों की खोज करती है:

count(array_filter( 
    array_map("strpos", array_fill(0, count($letters), $str), $letters),
"is_int")) == count($letters)

3

आप यह कोशिश कर सकते हैं:

function in_array_strpos($word, $array){

foreach($array as $a){

    if (strpos($word,$a) !== false) {
        return true;
    }
}

return false;
}

1

आप नेप्रेशन के लिए स्ट्रैपब्रक () का उपयोग करने की कोशिश कर सकते हैं (अक्षरों में से कोई भी नहीं मिला है):

$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';

if(strpbrk($string, implode($find_letters)) === false)
{
    echo 'None of these letters are found in the string!';
}

1

यह मेरा दृष्टिकोण है। एक मैच पाए जाने तक स्ट्रिंग में वर्णों पर फेरबदल करें। सुइयों के एक बड़े सरणी पर यह स्वीकार किए गए उत्तर को बेहतर बना देगा क्योंकि यह निर्धारित करने के लिए प्रत्येक सुई की जांच करने की आवश्यकता नहीं है कि एक मैच मिल गया है।

function strpos_array($haystack, $needles = [], $offset = 0) {
    for ($i = $offset, $len = strlen($haystack); $i < $len; $i++){
        if (in_array($haystack[$i],$needles)) {
            return $i;
        }
    }
    return false;
}

मैंने इसे स्वीकार किए गए उत्तर के खिलाफ बेंचमार्क किया और 7 से अधिक की एक सरणी के साथ $needlesयह नाटकीय रूप से तेज था ।


0

निम्नलिखित कोड के साथ:

$flag = true;
foreach($find_letters as $letter)
    if(false===strpos($string, $letter)) {
        $flag = false; 
        break;
    }

फिर के मूल्य की जाँच करें $flag। यदि यह है true, सभी पत्र पाए गए हैं। यदि नहीं, तो false


0

मैं एक नया उत्तर लिख रहा हूँ, जो उम्मीद करता है कि मैं जो भी हूं उसके समान दिखने में किसी की भी मदद करूं।

यह काम करता है "मेरे पास कई सुई हैं और मैं उन्हें एकल-आउट स्ट्रिंग खोजने के लिए उपयोग करने की कोशिश कर रहा हूं"। और यह वह प्रश्न है जो मुझे पता चला है।

    $i = 0;
    $found = array();
    while ($i < count($needle)) {
        $x = 0;
        while ($x < count($haystack)) {
            if (strpos($haystack[$x], $needle[$i]) !== false) {
                array_push($found, $haystack[$x]);
            }
            $x++;
        }
        $i++;
    }

    $found = array_count_values($found);

सरणी $foundमें सभी मिलान सुइयों की एक सूची होगी, उच्चतम गणना मान वाले सरणी का आइटम वह स्ट्रिंग होगा जो आप खोज रहे हैं, आप इसके साथ प्राप्त कर सकते हैं:

print_r(array_search(max($found), $found));

0

@Binyamin और @Timo का उत्तर दें .. (टिप्पणी जोड़ने के लिए पर्याप्त बिंदु नहीं ..), लेकिन परिणाम में स्थिति नहीं है ..
नीचे दिया गया कोड पहले तत्व की वास्तविक स्थिति को लौटा देगा, जो कि अभीष्ट है करना। यह उपयोगी है यदि आप ठीक 1 मैच खोजने की उम्मीद कर रहे हैं .. यदि आप कई मैच खोजने की उम्मीद कर रहे हैं, तो पहले पाया गया स्थान निरर्थक हो सकता है।

function strposa($haystack, $needle, $offset=0) {
    if(!is_array($needle)) $needle = array($needle);
    foreach($needle as $query) {
      $res=strpos($haystack, $query, $offset);
      if($res !== false) return $res; // stop on first true result
    }
    return false;
}

0

बस ऊपर के जवाब से एक उन्नयन

function strsearch($findme, $source){
    if(is_array($findme)){
        if(str_replace($findme, '', $source) != $source){
            return true;
        }
    }else{
        if(strpos($source,$findme)){
            return true;
        }
    }
    return false;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.