PHP केस-असंवेदनशील in_array फ़ंक्शन


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
नियमित अभिव्यक्ति का उपयोग करना एक अच्छा समाधान नहीं है, क्योंकि यह धीमा हो सकता है ... हो सकता है कि array_map तेज़ हो
-

5
In_array के लिए एक ड्रॉप-इन प्रतिस्थापन बनाने के लिए, एक बूल वापस करना, यह हो जाता है count(preg_grep('/^'.preg_quote($needle).'/$',$a)>0):। इतना सुंदर नहीं है, फिर। (^ ^ और $ वर्णों की आवश्यकता है, जब तक कि आंशिक मिलान वांछित नहीं है।) हालांकि यदि आप वास्तव में मिलान प्रविष्टियों को वापस चाहते हैं, तो मुझे यह समाधान पसंद है।
डैरेन कुक

2
अंतिम टिप्पणी में एक सिंटैक्स त्रुटि है: / $ को इसके बजाय $ / होना चाहिए।
गोगोविट्स्क

1
@DarrenCook जहाँ तक मुझे पता है कि एक बूल कास्ट भी काम करेगा (बूल) preg_grep ('/ ^'। preg_quote ($ सुई)। '$ /', $ a), के रूप में एक खाली सरणी झूठी
arraintxo

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
क्या यहां array_combine के बजाय array_flip और भी तेज़ समाधान नहीं होगा? $ search_array = array_flip (array_map ('strtolower', $ a));
जकूब_जो

एक पंक्ति: in_array (strtolower ($ शब्द), array_map ('strtolower', $ array))
एंड्रयू

1
@ अकीरा यमामोटो - "फिक्स सिंटैक्स" एडिट के साथ क्या है ? हमें यहां कोड तय करने की अनुमति नहीं है। मैंने उसे वापस घुमाया।
फंक

या array_change_key_case उपयोग () secure.php.net/manual/en/function.array-change-key-case.php
boctulus

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

से प्रलेखन


3
आपको कहीं और से प्राप्त कोड (या वास्तव में कुछ भी) को अवरुद्ध करना चाहिए।
cletus

3
केवल स्पष्ट करने के लिए। यह आलोचना नहीं है। सिर्फ एक सुझाव (और केवल मेरी राय, कुछ भी आधिकारिक नहीं)। :) कम से कम अगर मैं एक पृष्ठ से एक कोड स्निपेट कॉपी करता हूं तो मैं इसे उद्धृत करूंगा।
cletus

3
इसके अलावा, एक कोड ब्लॉक का उपयोग करना बेहतर ढंग से इसका वर्णन करता है, क्योंकि यह 'कोड' है। इसे उद्धृत करने से ब्लॉक करना ठीक से प्रारूपित करने की अनुमति नहीं देता है।
टायलर कार्टर

मैं >हर लाइन में जोड़ने के लिए वास्तविक बटन का उपयोग करने के बाद , यह सही है, यह काम करता है। मैं सिर्फ >पहली पंक्ति में मैन्युअल रूप से डालने के लिए उपयोग किया जाता हूं ।
टायलर कार्टर

मैं इसे करने के लिए ctrl-Q का उपयोग कर रहा हूं। कोड ब्लॉक के साथ यह एक समस्या है क्योंकि किसी कारण से यह लाइनों को लपेटता है। मुझसे मत पूछो क्यों। लेकिन आप या तो इसे सही कर सकते हैं या मैन्युअल रूप >से प्रत्येक पंक्ति के प्रारंभ में डाल सकते हैं ।
क्लेटस

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

स्रोत: php.net in_array मैनुअल पेज।


यदि आपको पता है कि सरणी में क्या है, तो आप array_map को छोड़ सकते हैं; लेकिन यह एक अच्छा उदाहरण है।
डॉन

2
मैंने वास्तव में किया था। क्योंकि हर कॉल पर एरे की मैपिंग अच्छी तरह से आकर्षक है।
cletus

इसके अलावा, यह मानते हुए कि (चचा की तरह) यह डॉक्स से सीधे आता है, इसे कोट करना बेहतर है।
cletus

10

कहते हैं कि आप in_array का उपयोग करना चाहते हैं, यहां बताया गया है कि आप खोज मामले को कैसे असंवेदनशील बना सकते हैं।

असंवेदनशील 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

उपरोक्त सही है यदि हम मानते हैं कि सरणियों में केवल तार हो सकते हैं, लेकिन सरणियों में अन्य सरणियाँ भी हो सकती हैं। इसके अलावा in_array () फ़ंक्शन $ सुई के लिए एक सरणी को स्वीकार कर सकता है, इसलिए strtolower ($ सुई) काम नहीं करने वाला है यदि $ सुई एक सरणी और array_map ('strtolower', $ haystack) काम नहीं करने जा रही है यदि $ haystack में अन्य शामिल हैं सरणियाँ, लेकिन "PHP चेतावनी: strtolower () पैरामीटर 1 को स्ट्रिंग, सरणी दिए जाने" की उम्मीद करता है।

उदाहरण:

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

इसलिए मैंने केस-संवेदी और केस-इनसेटिव in_array () चेक बनाने के लिए संबंधित विधियों के साथ एक सहायक वर्ग बनाया। मैं strtolower () के बजाय mb_strtolower () का उपयोग कर रहा हूं, इसलिए अन्य एन्कोडिंग का उपयोग किया जा सकता है। यहाँ कोड है:

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 के करीब कुछ । यह पोस्ट बिल्कुल सही नहीं है, लेकिन इसका दिल सही जगह पर है।
मिकमैकुसा

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 (खोज, सरणी, प्रकार)
  • यदि खोज पैरामीटर एक स्ट्रिंग है और प्रकार पैरामीटर TRUE पर सेट है, तो खोज केस-संवेदी है।
  • इसलिए खोज को मामले को अनदेखा करने के लिए, इस तरह से इसका उपयोग करना पर्याप्त होगा:

$ = एक सरणी ('एक', 'दो', 'तीन', 'चार');

$ b = in_array ('ONE', $ a, गलत);


6
तीसरा पैरामीटर नियंत्रित करता है कि चर का प्रकार चेक किया गया है या नहीं , मामला नहीं । जब trueसख्त प्रकार की तुलनाओं का उपयोग किया जाएगा, उदाहरण के लिए '1' !== 1। जब falseटाइपिंग का उपयोग किया जाएगा, जैसे '1' == 1। प्रलेखन के लिए php.net/in_array और php.net/manual/en/types.comparison.php देखें ।
लीपावर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.