স্ট্রপোজে সূঁচ হিসাবে একটি অ্যারে ব্যবহার করা


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

4
@ আরনাউদ, আপনার প্রস্তাবিত প্রয়োগ কী?
বিনয়ামিন

4
আমি নিশ্চিত নই, তবে সম্ভবত আমরা অফসেট থেকে স্ট্রিংটিতে অগ্রসর হতে পেরেছিলাম এবং প্রথম সূঁচটি পাওয়া গেলে থামাতে পারি। "ক" পূর্ণ একটি বড় পাঠ্য সম্পর্কে চিন্তা করুন। $ সূঁচ নিন = [ক, খ]। আপনার ফাংশনটি strposaসমস্ত পাঠ্যের মধ্য দিয়ে চলবে তবে এটি প্রয়োজনীয় নয়! আমি কি বোধগম্য?
আরনাড

বৈশিষ্ট্যটির পরামর্শের জন্য @ আরনাডকে ধন্যবাদ! আমি আপনার পরামর্শের গুরুত্বের সাথে সম্পূর্ণ একমত এবং উন্নত কোড উদাহরণ সহ আমার উত্তর আপডেট করেছি।
বিনয়ামিন

এটি হ'ল আমি যা বলতে চেয়েছিলাম তা ঠিক নয়, কারণ আপনার নতুন ফাংশনটি দিয়ে $ সূঁচ = [বি, এ] এখনও একটি সমস্যা রয়েছে এবং অতিরিক্তভাবে এই ফাংশনটি আর প্রথম ঘটনার অবস্থানটি ফিরিয়ে দেয় না। আমাকে আরও কিছু ব্যাখ্যা করি। ধরে নিন যে স্ট্রিংটি "এবিসিডিইএফ", এবং সূঁচগুলি সি এবং এফ হয় আমরা যা করতে পারতাম স্ট্রিংয়ের মধ্য দিয়ে চলছে: এ, বি ... সি! আমরা সি সনাক্ত করি, সুতরাং আমরা এখানে থামি এবং আমরা একটি সূঁচের প্রথম উপস্থিতির অবস্থানটি ফিরিয়ে আনতে পারি, এটি ২ It এটি একক-চরিত্রের স্ট্রিংয়ের চেয়ে বেশি কাজ করতে পারে, তবে আমি সঠিক বাস্তবায়ন সম্পর্কে চিন্তা করিনি।
আরনাড

4
আমি কোডটি পরিবর্তন করে উন্নত করেছি foreach($needle as $k => $query) { if(strpos($haystack, $query, $offset) !== false) return $k; }, সুতরাং এটি আরও হ্যান্ডলিংয়ের জন্য মিলে যাওয়া আইটেমটির কীটি ফিরিয়ে দেয়।
জেমস ক্যামেরন

54

str_replace যথেষ্ট দ্রুত conside

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

বাক্য গঠন ত্রুটি: # 3 লাইনে 1 বন্ধনী বন্ধনীর সংখ্যা (> 6 অক্ষর সম্পাদনার প্রয়োজনীয়তার কারণে আমি উপরের কোডে এটি সরাসরি সংশোধন করতে পারিনি;))
ধনী

4
উফফ, এটা কাফের বাইরে ছিল। এখনই স্থির। মাথার জন্য চিয়ার্স আপ!
লিওন

8
সবচেয়ে বড় সমাধান!
অ্যান্ডিস

18

নীচের কোডটি এটি কীভাবে করবেন তা কেবল দেখায় না, তবে এটি এগিয়ে চলার ফাংশনটি সহজেই ব্যবহার করতে পারে। এটি লিখেছিলেন "জেসদা"। (আমি এটি অনলাইনে পেয়েছি)

পিএইচপি কোড:

<?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 

আমি বিশ্বাস করি এটি কেবল এটির প্রথম অবস্থান খুঁজে পায়। খড়ের খড়ের প্রতিটি সূঁচের অবস্থান ফিরিয়ে আনতে কীভাবে এটি টুইট করতে হয় তার জন্য কোনও পরামর্শ?
ছায়া কুপার

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
}

অবিশ্বাস্য উত্তর - একাধিক স্ট্রপোস () এর চেয়ে খুব দ্রুত কার্যকরকরণ, উদাহরণস্বরূপ, যদি (স্ট্রপোস ($ স্ট্রিং, "এ")! == মিথ্যা && স্ট্রপোস ($ স্ট্রিং, "সি")! == মিথ্যা && স্ট্রপোস ($ স্ট্রিং, " d ")! == মিথ্যা)
ও একমাত্র রসায়ন

5

প্রশ্নটি, প্রদত্ত উদাহরণটি কেবল একটি "উদাহরণ" বা আপনি যা খুঁজছেন তা কি সঠিক? এখানে অনেক মিশ্র উত্তর রয়েছে এবং আমি গৃহীত উত্তরগুলির জটিলতা বুঝতে পারি না।

সূঁচের অ্যারের কোনও সামগ্রী স্ট্রিংয়ে উপস্থিত রয়েছে কিনা তা খুঁজে বের করার জন্য এবং দ্রুত সত্য বা মিথ্যা ফিরে:

$string = 'abcdefg';

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

যদি তাই হয় তবে দয়া করে @ লিওন ক্রেডিট দিন।

সূঁচের অ্যারের সমস্ত মানগুলি স্ট্রিংয়ে বিদ্যমান কিনা তা সন্ধান করার জন্য , এই ক্ষেত্রে যেমন তিনটি 'a', 'b'এবং 'c'অবশ্যই উপস্থিত থাকতে হবে, যেমন আপনি আপনার "উদাহরণস্বরূপ" হিসাবে উল্লেখ করেছেন

প্রতিধ্বনি 'সমস্ত অক্ষর স্ট্রিংয়ে পাওয়া যায়!';

এখানে অনেক উত্তর সেই প্রসঙ্গের বাইরে, তবে আমি সন্দেহ করি যে আপনি সমাধান হিসাবে চিহ্নিত হিসাবে প্রশ্নটির নিবিড়তা। উদাহরণস্বরূপ গৃহীত উত্তরটি একটি সুই need

$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;
}

আমি এটি গ্রহণযোগ্য উত্তরের বিপরীতে চিহ্নিত করেছি এবং ked টিরও বেশি অ্যারে সহ $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

@ বিিনিয়ামিন এবং @ টিমোকে উত্তর দিন .. (কোনও মন্তব্য যুক্ত করার জন্য পর্যাপ্ত পয়েন্ট নয় ..) তবে ফলাফলটিতে অবস্থান নেই ..
নীচের কোডটি প্রথম উপাদানটির আসল অবস্থানটি ফিরিয়ে দেবে যা স্ট্রপোসকে উদ্দেশ্য করে কর আপনি যদি ঠিক 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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.