পিএইচপি কেস-সংবেদনশীল ইন-অ্যারে ফাংশন


131

in_arrayফাংশনটি ব্যবহার করার সময় কি কেস-সংবেদনশীল তুলনা করা সম্ভব ?

সুতরাং এটির মতো একটি উত্স অ্যারের সাথে:

$a= array(
 'one',
 'two',
 'three',
 'four'
);

নিম্নলিখিত বর্ণনাগুলি সমস্ত সত্য ফিরে আসবে:

in_array('one', $a);
in_array('two', $a);
in_array('ONE', $a);
in_array('fOUr', $a);

কোন ফাংশন বা ফাংশনের সেট একই কাজ করবে? আমি in_arrayনিজেও এটি করতে পারি বলে মনে করি না ।

উত্তর:


101

আপনি ব্যবহার করতে পারেন preg_grep():

$a= array(
 'one',
 'two',
 'three',
 'four'
);

print_r( preg_grep( "/ONe/i" , $a ) );

37
নিয়মিত এক্সপ্রেশন ব্যবহার করা ভাল সমাধান নয়, কারণ এটি ধীর হতে পারে ... সম্ভবত অ্যারে_ম্যাপটি দ্রুত
phil-opp

5
এটি একটি ড্রপ-ইন in_array জন্য প্রতিস্থাপন করতে, একটি bool ফিরে, এটা হয়ে: count(preg_grep('/^'.preg_quote($needle).'/$',$a)>0)। তাই মার্জিত না, তারপর। (লক্ষ করুন যে ^ এবং $ অক্ষরগুলি আবশ্যক, যদি না আংশিক মিলের প্রয়োজন হয়)) তবে আপনি যদি সত্যই ম্যাচিং এন্ট্রিগুলি চান তবে আমি এই সমাধানটি পছন্দ করি।
ড্যারেন কুক

2
শেষ মন্তব্যে একটি বাক্য গঠন ত্রুটি রয়েছে: / instead এর পরিবর্তে be / হওয়া উচিত।
Gogowitsch

1
@ ড্যারেনকুক যতদূর আমি জানি যে একটি কুল কাস্টও কাজ করতে পারে (বুল) প্রেগ_গ্রিপ ('/ ^'। প্রেগ_কোট ($ সূঁচ)। '$ /', $ এ), খালি অ্যারেটি মিথ্যা হিসাবে ফেলে দেবে
অ্যারেঞ্জটক্সো

8
যাওয়ার সহজ উপায় মনে হচ্ছে কেবল ছোট হাতের অক্ষরে রূপান্তর করা।
জোশুয়া ডান্স

229

সুস্পষ্ট কাজটি কেবল অনুসন্ধান শব্দটিকে ছোট হাতের মধ্যে রূপান্তর করা:

if (in_array(strtolower($word), $array)) { 
  ...

অবশ্যই অ্যারেতে যদি বড় হাতের অক্ষর থাকে তবে আপনাকে প্রথমে এটি করতে হবে:

$search_array = array_map('strtolower', $array);

এবং এটি অনুসন্ধান। strtolowerপ্রতিটি অনুসন্ধানের সাথে পুরো অ্যারে করার কোনও অর্থ নেই ।

অ্যারেগুলি অনুসন্ধান করা লিনিয়ার। আপনার যদি একটি বড় অ্যারে থাকে বা আপনি এটি অনেক কিছু করতে চলেছেন তবে অনুসন্ধানের পদগুলি অ্যারের কীতে রেখে দেওয়া ভাল কারণ এটি আরও দ্রুত অ্যাক্সেস করবে:

$search_array = array_combine(array_map('strtolower', $a), $a);

তারপর

if ($search_array[strtolower($word)]) { 
  ...

এখানে কেবলমাত্র সমস্যাটি হ'ল অ্যারে কীগুলি অবশ্যই অনন্য হবে তাই আপনার যদি সংঘর্ষ হয় (উদাহরণস্বরূপ "এক" এবং "একটি") আপনি একটি ব্যতীত সমস্ত হারাবেন।


23
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। নিয়মিত ভাব প্রকাশ করা কখনও কখনও 2 টি সমস্যা তৈরি করে।
জোশুয়া ডান্স

1
অ্যারে_ক্লাবিনের পরিবর্তে এখানে অ্যারে_ফ্লিপটি আরও দ্রুত সমাধান হবে না? $ অনুসন্ধান_আররে = অ্যারে_ফ্লিপ (অ্যারে_ম্যাপ ('স্ট্র্টলওয়ার', $ এ)));
জাকব_জো

এক লাইন: ইন_আরে (স্ট্র্টলওয়ার ($ শব্দ), অ্যারে_ম্যাপ ('স্ট্র্টলওয়ার', $ অ্যারে))
অ্যান্ড্রু

1
@ আকীরা ইয়ামামোটো - "ফিক্স সিনট্যাক্স" সম্পাদনাটি কী? আমাদের এখানে কোড ঠিক করার অনুমতি নেই। আমি এটি পিছনে ঘূর্ণিত।
ফানকি চল্লিশ নিনার

অথবা অ্যারে_চেঞ্জ_কি_সেস () নিরাপদ.পিএফপিএন
ম্যানুয়াল /

113
function in_arrayi($needle, $haystack) {
    return in_array(strtolower($needle), array_map('strtolower', $haystack));
}

ডকুমেন্টেশন থেকে


3
আপনি অন্য কোথাও থেকে ব্লককোট কোড (বা সত্যিই কিছু) পেতে হবে।
ক্লিটাস

3
শুধু পরিষ্কার হতে। এটা কোন সমালোচনা নয়। কেবলমাত্র একটি পরামর্শ (এবং শুধুমাত্র আমার মতে, অফিসিয়াল কিছুই নয়)। :) কমপক্ষে যদি আমি কোনও পৃষ্ঠা থেকে কোনও কোড স্নিপেট অনুলিপি করে থাকি তবে আমি এটিকে উদ্ধৃত করব।
ক্লিটাস

3
এছাড়াও, একটি কোড ব্লক ব্যবহার করে এটি 'কোড' হওয়ায় এটি আরও ভালভাবে বর্ণনা করে। এটিকে অবরুদ্ধ করা অবরুদ্ধ করুন এটি সঠিকভাবে ফর্ম্যাটেড হওয়ার অনুমতি দেয় না।
টাইলার কার্টার

আমি সংশোধন করে দাঁড়িয়েছি, >প্রতিটি লাইনে যুক্ত করতে আসল বোতামটি ব্যবহার করার পরে , এটি কাজ করে। আমি >প্রথম পংক্তিতে নিজেই এটিকে রাখার অভ্যস্ত am
টাইলার কার্টার

আমি এটি করতে সিটিআরএল-কিউ ব্যবহার করতে অভ্যস্ত। কোড ব্লকগুলির সাথে এটির একটি সমস্যা রয়েছে কারণ কোনও কারণে এটি লাইনগুলিকে আবৃত করে। আমাকে জিজ্ঞাসা করবেন না কেন। তবে আপনি যে কোনওটি ঠিক করতে পারেন বা >প্রতিটি লাইনের শুরুতে ম্যানুয়ালি একটি রাখতে পারেন ।
ক্লিটাস

50
function in_arrayi($needle, $haystack) {
    return in_array(strtolower($needle), array_map('strtolower', $haystack));
}

উত্স: php.net in_array ম্যানুয়াল পৃষ্ঠা।


অ্যারেতে কী রয়েছে তা যদি আপনি জানেন তবে আপনি অ্যারে_ম্যাপটি ছেড়ে দিতে পারেন; তবে এটি একটি ভাল উদাহরণ।
ডন

2
আমি আসলে করেছি। কারণ প্রতিটি কলটিতে অ্যারের ম্যাপিং হ'ল ভাল, হাস্যকর।
ক্লিটাস

এছাড়াও, ধরে নিই (চাচের মতো) এটি ডক্স থেকে সরাসরি আসে, এটিকে উদ্ধৃতি দেওয়াই ভাল।
ক্লিটাস

10

বলুন যে আপনি in_array ব্যবহার করতে চান, এখানে আপনি কীভাবে অনুসন্ধান কেসকে সংবেদনশীল করতে পারবেন।

কেস ইনসেসেটিভ ইন_ারে ():

foreach($searchKey as $key => $subkey) {

     if (in_array(strtolower($subkey), array_map("strtolower", $subarray)))
     {
        echo "found";
     }

}

সংবেদনশীল সাধারণ ক্ষেত্রে:

foreach($searchKey as $key => $subkey) {

if (in_array("$subkey", $subarray))

     {
        echo "found";
     }

}

2

উপরের অংশটি সঠিক যদি আমরা ধরে নিই যে অ্যারেগুলিতে কেবল স্ট্রিং থাকতে পারে তবে অ্যারেতে অন্যান্য অ্যারেও থাকতে পারে। এছাড়াও ইন_আরে () ফাংশনটি $ সুইয়ের জন্য একটি অ্যারে গ্রহণ করতে পারে, সুতরাং স্ট্র্টলওয়ার ($ সুই) কাজ করছে না যদি $ সুই একটি অ্যারে হয় এবং অ্যারে_ম্যাপ ('স্ট্রোল্টওয়ার', $ খড়ের কাঁটা) কাজ করে না যদি $ খড়ের ছাঁটে অন্যটি থাকে অ্যারে, তবে "পিএইচপি সতর্কতা: স্ট্র্টলওয়ার () প্যারামিটার 1 টি স্ট্রিং, অ্যারে প্রদত্ত বলে প্রত্যাশা করে" এর ফলাফল করবে।

উদাহরণ:

$needle = array('p', 'H');
$haystack = array(array('p', 'H'), 'U');

সুতরাং আমি কেস-সংবেদনশীল এবং কেস-সংবেদনশীল ইন_আরএ () চেকগুলি তৈরি করতে রিলেভেন্ট পদ্ধতিগুলির সাহায্যে একটি সহায়ক শ্রেণি তৈরি করেছি। আমি স্ট্র্টলওয়ার () এর পরিবর্তে এমবি_স্ট্রোলটার ()ও ব্যবহার করছি, যাতে অন্যান্য এনকোডিংগুলি ব্যবহার করা যায়। কোডটি এখানে:

class StringHelper {

public static function toLower($string, $encoding = 'UTF-8')
{
    return mb_strtolower($string, $encoding);
}

/**
 * Digs into all levels of an array and converts all string values to lowercase
 */
public static function arrayToLower($array)
{
    foreach ($array as &$value) {
        switch (true) {
            case is_string($value):
                $value = self::toLower($value);
                break;
            case is_array($value):
                $value = self::arrayToLower($value);
                break;
        }
    }
    return $array;
}

/**
 * Works like the built-in PHP in_array() function — Checks if a value exists in an array, but
 * gives the option to choose how the comparison is done - case-sensitive or case-insensitive
 */
public static function inArray($needle, $haystack, $case = 'case-sensitive', $strict = false)
{
    switch ($case) {
        default:
        case 'case-sensitive':
        case 'cs':
            return in_array($needle, $haystack, $strict);
            break;
        case 'case-insensitive':
        case 'ci':
            if (is_array($needle)) {
                return in_array(self::arrayToLower($needle), self::arrayToLower($haystack), $strict);
            } else {
                return in_array(self::toLower($needle), self::arrayToLower($haystack), $strict);
            }
            break;
    }
}
}

1

কোডটি নীচে রয়েছে এমন একটি অ্যারেতে সংবেদনশীল মানটি পরীক্ষা করার জন্য আমি একটি সাধারণ ফাংশন লিখেছি।

ফাংশন:

function in_array_insensitive($needle, $haystack) {
   $needle = strtolower($needle);
   foreach($haystack as $k => $v) {
      $haystack[$k] = strtolower($v);
   }
   return in_array($needle, $haystack);
}

ব্যবহারবিধি:

$array = array('one', 'two', 'three', 'four');
var_dump(in_array_insensitive('fOUr', $array));

1
/**
 * in_array function variant that performs case-insensitive comparison when needle is a string.
 *
 * @param mixed $needle
 * @param array $haystack
 * @param bool $strict
 *
 * @return bool
 */
function in_arrayi($needle, array $haystack, bool $strict = false): bool
{

    if (is_string($needle)) {

        $needle = strtolower($needle);

        foreach ($haystack as $value) {

            if (is_string($value)) {
                if (strtolower($value) === $needle) {
                    return true;
                }
            }

        }

        return false;

    }

    return in_array($needle, $haystack, $strict);

}


/**
 * in_array function variant that performs case-insensitive comparison when needle is a string.
 * Multibyte version.
 *
 * @param mixed $needle
 * @param array $haystack
 * @param bool $strict
 * @param string|null $encoding
 *
 * @return bool
 */
function mb_in_arrayi($needle, array $haystack, bool $strict = false, ?string $encoding = null): bool
{

    if (null === $encoding) {
        $encoding = mb_internal_encoding();
    }

    if (is_string($needle)) {

        $needle = mb_strtolower($needle, $encoding);

        foreach ($haystack as $value) {

            if (is_string($value)) {
                if (mb_strtolower($value, $encoding) === $needle) {
                    return true;
                }
            }

        }

        return false;

    }

    return in_array($needle, $haystack, $strict);

}

অবশেষে। কেউ পদক্ষেপ নেওয়ার আগে এবং সবচেয়ে দক্ষ কৌশল সরবরাহ করার আগে এটি 8 বছর সময় নিয়েছিল - প্রথম দিকেreturn । যখন কেবল সূঁচের 1 টি অনুসন্ধান করার প্রয়োজন হয়, এটি সন্ধানের পরে পুনরাবৃত্তি করা অর্থহীন। আমি একটি টাইপো ঠিক করব, কঠোর ধারণায় বেক করব এবং কিছু সংশোধন করব যদিও সম্ভবত 3v4l.org/WCTi2 এর কাছাকাছি কিছু । এই পোস্টটি নিখুঁত নয়, তবে এর হৃদয় সঠিক জায়গায় is
মিকম্যাকুসা

0
$a = [1 => 'funny', 3 => 'meshgaat', 15 => 'obi', 2 => 'OMER'];  

$b = 'omer';

function checkArr($x,$array)
{
    $arr = array_values($array);
    $arrlength = count($arr);
    $z = strtolower($x);

    for ($i = 0; $i < $arrlength; $i++) {
        if ($z == strtolower($arr[$i])) {
            echo "yes";
        }  
    } 
};

checkArr($b, $a);

1
দয়া করে আপনি যে সমাধানটি প্রস্তাব করছেন তার একটি বর্ণনাকার যুক্ত করুন।
il_raffa

-2
  • in_array এই প্যারামিটারগুলি গ্রহণ করে: in_array (অনুসন্ধান, অ্যারে, প্রকার)
  • যদি অনুসন্ধানের প্যারামিটারটি একটি স্ট্রিং হয় এবং পরামিতি প্রকারটি সত্যে সেট করা থাকে তবে অনুসন্ধানটি কেস-সংবেদনশীল।
  • সুতরাং অনুসন্ধানটি কেসটিকে উপেক্ষা করার জন্য এটি এটি ব্যবহারের জন্য যথেষ্ট হবে:

$ a = অ্যারে ('এক', 'দুই', 'তিন', 'চার');

$ খ = ইন_আরে ('ওয়ান', $ এ, ভুয়া);


6
তৃতীয় প্যারামিটারটি নিয়ন্ত্রণ থাকুক বা না থাকুক টাইপ ভেরিয়েবলের পরীক্ষা করা হয়, না ক্ষেত্রে । যখন trueকঠোর প্রকারের তুলনা ব্যবহৃত হবে, যেমন '1' !== 1। যখন falseটাইপ জাগলিং ব্যবহৃত হবে, যেমন '1' == 1। ডকুমেন্টেশনের জন্য php.net/in_array এবং php.net/manual/en/tyype.comparisons.php দেখুন ।
leipowers
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.