in_array () और बहुआयामी सरणी


243

मैं in_array()यह जांचने के लिए उपयोग करता हूं कि क्या नीचे किसी सरणी में मान मौजूद है,

$a = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $a)) 
{
    echo "Got Irix";
}

//print_r($a);

लेकिन एक बहुआयामी सरणी (नीचे) के बारे में क्या है - मैं उस मूल्य की जांच कैसे कर सकता हूं कि क्या यह बहु-सरणी में मौजूद है?

$b = array(array("Mac", "NT"), array("Irix", "Linux"));

print_r($b);

या in_array()जब मैं बहुआयामी सरणी में आता हूं तो मुझे इसका उपयोग नहीं करना चाहिए ?


1
स्वीकृत समाधान बढ़िया काम करता है, लेकिन PHP के प्रकार की बाजीगरी के कारण गैर-सख्त तुलना करने पर अनपेक्षित परिणाम हो सकते हैं । देखें: stackoverflow.com/a/48890256/1579327
पाओलो

1
दोनों jwueller के उत्तर और मेरा आपके प्रश्न के सही उत्तर हैं। मैंने एक वैकल्पिक समाधान प्रस्तावित किया जो गैर-सख्त तुलना करते समय PHP के प्रकार के करतब दिखाने के कारण एक सामान्य पिटफेल से बचने के लिए jwueller के फ़ंक्शन का विस्तार करता है।
पाओलो

1
एक लाइनर:var_dump(array_sum(array_map(function ($tmp) {return in_array('NT',$tmp);}, $multiarray)) > 0);
अग्निअस वसीलियास्कस

1
@AgniusVasiliauskas चतुर समाधान, लेकिन पहले स्तर के सरणी में कोई ऐसा आइटम नहीं है, जिसमें कोई मुद्दा नहीं है, उदाहरण: ex:$multiarray = array( "Hello", array("Mac", "NT"), array("Irix", "Linux"));
पाओलो

1
@ पाओलो कोई भी आपकी ज़रूरत के अनुसार अनाम फ़ंक्शन का विस्तार करने से रोकता है - इस मामले में अनाम फ़ंक्शन में चेक जोड़ें यदि चर फ़ंक्शन के $tmpसाथ एक सरणी is_array()है। यदि कोई सरणी नहीं है - अलग परिदृश्य के साथ आगे बढ़ें।
अग्निस वसीलियास्कस

जवाबों:


473

in_array()बहुआयामी सरणियों पर काम नहीं करता है। आप अपने लिए ऐसा करने के लिए एक पुनरावर्ती कार्य लिख सकते हैं:

function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}

उपयोग:

$b = array(array("Mac", "NT"), array("Irix", "Linux"));
echo in_array_r("Irix", $b) ? 'found' : 'not found';

1
धन्यवाद। समारोह सुरुचिपूर्ण है! इसे प्यार करना! धन्यवाद। जब मैं आपका फ़ंक्शन चलाता हूं तो मुझे कैसे पता चलेगा कि यह सही है या गलत है? धन्यवाद।
laukok

14
मैं कुछ ऐसा कर रहा था, जो आपने किया, आपने मुझे अपना खुद का लिखने से बचाया :)
Liam W

1
यह बहुत अच्छा काम करता है। तो हम सरणी कुंजी कैसे खोज और प्रदर्शित कर सकते हैं? उदाहरण के लिए: $ b = array (1 => array ("Mac", "NT"), 3 => array ("Irix", "Linux"));
राशद

2
StackOverflow पर @ डीटेट कोड सीसी बाय-सा 3.0 के तहत लाइसेंस के लिए आवश्यक है जिसके साथ रेकशन आवश्यक है (पृष्ठ पाद लेख देखें)। आप बस इस उत्तर के लिए पर्मलिंक के साथ एक टिप्पणी शामिल कर सकते हैं।
jwueller

1
@blamb: यह बहुत जानबूझकर है। यह वह है जो फ़ंक्शन को पुनरावर्ती बनाता है (इसलिए , उदाहरण के लिए _r, अनुरूप print_r())। यह मूल्य के लिए खोज करने के लिए सभी नेस्टेड सरणियों में उतरता है जब तक कि कोई और सरणियां नहीं मिलें। इस तरह, आप केवल दो स्तरों के बजाय मनमानी जटिलता के सरणियों के माध्यम से खोज कर सकते हैं।
जुवैलर

56

यदि आप जानते हैं कि किस स्तंभ को खोजा जाना है, तो आप array_search () और array_column () का उपयोग कर सकते हैं:

$userdb = Array
(
    (0) => Array
        (
            ('uid') => '100',
            ('name') => 'Sandra Shush',
            ('url') => 'urlof100'
        ),

    (1) => Array
        (
            ('uid') => '5465',
            ('name') => 'Stefanie Mcmohn',
            ('url') => 'urlof5465'
        ),

    (2) => Array
        (
            ('uid') => '40489',
            ('name') => 'Michael',
            ('url') => 'urlof40489'
        )
);

if(array_search('urlof5465', array_column($userdb, 'url')) !== false) {
    echo 'value is in multidim array';
}
else {
    echo 'value is not in multidim array';
}

यह विचार PHP मैनुअल पर array_search () के लिए टिप्पणी अनुभाग में है;


15
आप भी कोशिश कर सकते हैं: in_array ('मूल्य', array_column ($ गिरफ्तारी, 'सक्रिय'))
ekstro

1
आप के लिए PHP 5.5+ की जरूरत हैarray_column
meconroy

1
क्या इस उदाहरण में मिलान किए गए उप सरणी का यूआईडी प्राप्त करना संभव है? @ बेगम
zipal_

यह वही है जो मैं चाहता हूं
जुनैद अंसारी

यह एक लंबे समय के बाद यह समाधान मिला है!
रोहन आशिक

54

यह भी काम करेगा।

function in_array_r($item , $array){
    return preg_match('/"'.preg_quote($item, '/').'"/i' , json_encode($array));
}

उपयोग:

if(in_array_r($item , $array)){
    // found!
}

3
चतुर, मुझे यह पसंद है। मुझे आश्चर्य है कि foreachलूप की तुलना में प्रदर्शन कैसा है ।
जेम्स

1
एक जादू की तरह काम किया।
केमिकोफा भूत

1
मुझे गलत मत समझो, मुझे इस मामले के लिए यह दृष्टिकोण पसंद है। हालाँकि यह एक गलत सकारात्मक मैच लौटाएगा जब json_encoding $arrayजिसमें एक साहचर्य कुंजी हो जो मेल खाता हो $item। जब स्ट्रिंग में डबल कोट हो तो अनायास ही किसी स्ट्रिंग के भाग से मेल खाने की क्षमता का उल्लेख नहीं करना चाहिए। मैं केवल इस प्रश्न की तरह छोटी / सरल स्थितियों में इस फ़ंक्शन पर भरोसा करूंगा।
मिकमैकुसा

ध्यान दें कि यह विफल हो जाएगा यदि $itemइसमें ऐसे वर्ण हैं जो पहले पैरामीटर (नियमित अभिव्यक्ति) पर शिकंजा रखते हैंpreg_match
पाओलो

35

यह यह करेगा:

foreach($b as $value)
{
    if(in_array("Irix", $value, true))
    {
        echo "Got Irix";
    }
}

in_arrayकेवल एक आयामी सरणी पर कार्य करता है, इसलिए आपको प्रत्येक उप सरणी पर लूप करने और in_arrayप्रत्येक पर चलाने की आवश्यकता है ।

जैसा कि दूसरों ने नोट किया है, यह केवल 2-आयामी सरणी के लिए होगा। यदि आपके पास अधिक नेस्टेड ऐरे हैं, तो एक पुनरावर्ती संस्करण बेहतर होगा। उस के उदाहरण के लिए अन्य उत्तर देखें।


7
हालांकि, यह केवल एक आयाम में काम करेगा। प्रत्येक गहराई की जांच करने के लिए आपको एक पुनरावर्ती फ़ंक्शन बनाना होगा।
मेट्रोब्लाडरस

मैंने कोड चलाया, लेकिन इसमें एक त्रुटि है - पार्स त्रुटि: सी में पार्स त्रुटि: \ wamp \ www \ 000_TEST \ php \ php.in_array \ index.php लाइन 21 पर - जो कि अगर (in_array ("Irix"), $ मूल्य है ) धन्यवाद।
laukok

@lauthiamkok: )उल्लिखित लाइन के अंत में एक लापता है।
जुवेलेर

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

आपको हमेशा in_array()निर्धारित तीसरे पैरामीटर के साथ कॉल करना चाहिए true। यहाँ देखें क्यों: stackoverflow.com/questions/37080581/…
एंड्रियास

25

अगर आपके सरणी इस तरह

$array = array(
              array("name" => "Robert", "Age" => "22", "Place" => "TN"), 
              array("name" => "Henry", "Age" => "21", "Place" => "TVL")
         );

इसे इस्तेमाल करो

function in_multiarray($elem, $array,$field)
{
    $top = sizeof($array) - 1;
    $bottom = 0;
    while($bottom <= $top)
    {
        if($array[$bottom][$field] == $elem)
            return true;
        else 
            if(is_array($array[$bottom][$field]))
                if(in_multiarray($elem, ($array[$bottom][$field])))
                    return true;

        $bottom++;
    }        
    return false;
}

उदाहरण : echo in_multiarray("22", $array,"Age");


21
$userdb = Array
(
    (0) => Array
        (
            ('uid') => '100',
            ('name') => 'Sandra Shush',
            ('url') => 'urlof100'
        ),

    (1) => Array
        (
            ('uid') => '5465',
            ('name') => 'Stefanie Mcmohn',
            ('url') => 'urlof5465'
        ),

    (2) => Array
        (
            ('uid') => '40489',
            ('name') => 'Michael',
            ('url') => 'urlof40489'
        )
);

$url_in_array = in_array('urlof5465', array_column($userdb, 'url'));

if($url_in_array) {
    echo 'value is in multidim array';
}
else {
    echo 'value is not in multidim array';
}

2
हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन यह समस्या का हल कैसे और / या इसके बारे में अतिरिक्त संदर्भ प्रदान करता है, इससे उत्तर के दीर्घकालिक मूल्य में सुधार होगा।
डोनाल्ड डक

3
6 साल बाद इसने मुझे वो दिया जिसकी मुझे जरूरत है। array_column()
NappingRabbit

बहुआयामी सरणी के लिए सही उत्तर
रोशन सांचे

14

महान कार्य, लेकिन यह मेरे लिए काम नहीं किया जब तक मैं if($found) { break; }करने के लिए जोड़ाelseif

function in_array_r($needle, $haystack) {
    $found = false;
    foreach ($haystack as $item) {
    if ($item === $needle) { 
            $found = true; 
            break; 
        } elseif (is_array($item)) {
            $found = in_array_r($needle, $item); 
            if($found) { 
                break; 
            } 
        }    
    }
    return $found;
}

11

बहुआयामी बच्चों के लिए: in_array('needle', array_column($arr, 'key'))

एक आयामी बच्चों के लिए: in_array('needle', call_user_func_array('array_merge', $arr))


1
साफ! धन्यवाद @ 9ksoft
phaberest

और array_column()विधि के विपरीत, विधि call_user_func_array('array_merge')सूचकांक-आधारित बाल सरणियों के साथ भी काम करती है, +1

6

आप हमेशा अपने बहुआयामी सरणी को क्रमबद्ध कर सकते हैं strpos:

$arr = array(array("Mac", "NT"), array("Irix", "Linux"));

$in_arr = (bool)strpos(serialize($arr),'s:4:"Irix";');

if($in_arr){
    echo "Got Irix!";
}

मेरे द्वारा उपयोग की जाने वाली चीजों के लिए विभिन्न डॉक्स:


1
यह गलत है। यदि खोज-स्ट्रिंग कुछ सरणी-मान में है ("mytoll Irixus" में "Irix" पाएगी) तो आपका फ़ंक्शन भी सही देगा।
mdunisch

मैंने अपना उत्तर तय कर लिया है। @ user3351722

इस तरह से एक समस्या को ठीक किया जा सकता है जब कोई भी (अनोखा vale), और इसके गतिशील होने के लिए .. जैसे यह $ in_arr = (bool) strpos (serialize ($ user_term_was_downloaded), 's: 3: "tid"; s: 2: " '$ value-> टीआईडी।।'"; ');
अनीस हिकमत अबू हमीद

2
@ I - II को नहीं लगता कि स्टैक ओवरफ्लो पर कोई भी कोड पोस्ट करेगा यदि वे इसे साझा नहीं करना चाहते हैं। इस वेबसाइट पर किसी भी चीज़ के लिए किसी भी कोड का उपयोग करने के लिए स्वतंत्र महसूस करें। मैं आमतौर पर कोड स्निपेट के ऊपर एक टिप्पणी जोड़ देता हूं जो कहता है कि "धन्यवाद ढेर अतिप्रवाह" और फिर उस URL को पेस्ट करें जिससे मुझे कोड मिला है।

1
दिलचस्प जवाब, निश्चित रूप से कुछ स्थितियों में काम करता है, लेकिन सभी नहीं।
एमकेएन वेब सॉल्यूशंस

4

PHP 5.6 के बाद से मूल उत्तर के लिए एक बेहतर और क्लीनर समाधान है:

इस तरह एक बहुआयामी सरणी के साथ:

$a = array(array("Mac", "NT"), array("Irix", "Linux"))

हम स्पैट ऑपरेटर का उपयोग कर सकते हैं :

return in_array("Irix", array_merge(...$a), true)

यदि आपके पास इस तरह से स्ट्रिंग कुंजियाँ हैं:

$a = array("a" => array("Mac", "NT"), "b" => array("Irix", "Linux"))

array_valuesत्रुटि से बचने के लिए आपको इसका उपयोग करना होगा Cannot unpack array with string keys:

return in_array("Irix", array_merge(...array_values($a)), true)

2

स्वीकार किए जाते हैं समाधान (लेखन के समय) से jwueller

function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}

पूरी तरह से सही है लेकिन कमजोर तुलना (पैरामीटर $strict = false) करते समय अनपेक्षित व्यवहार हो सकता है ।

दोनों प्रकार के मूल्यों की तुलना करते समय PHP के प्रकार की बाजीगरी के कारण

"example" == 0

तथा

0 == "example"

मूल्यांकन किया जाता है trueक्योंकि इसमें "example"डाली जाती है intऔर बदल जाती है 0

(देखें कि PHP 0 को स्ट्रिंग के बराबर क्यों मानता है? )

यदि यह वांछित व्यवहार नहीं है, तो यह गैर-सख्त तुलना करने से पहले संख्यात्मक मूल्यों को स्ट्रिंग करने के लिए सुविधाजनक हो सकता है:

function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {

        if( ! $strict && is_string( $needle ) && ( is_float( $item ) || is_int( $item ) ) ) {
            $item = (string)$item;
        }

        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}

1

यह इस प्रकार का पहला कार्य है जो मुझे in_array के लिए php मैनुअल में मिला है । टिप्पणी अनुभागों में कार्य हमेशा सबसे अच्छे नहीं होते हैं, लेकिन अगर यह वह चाल नहीं करता है जो आप वहां भी देख सकते हैं :)

<?php
function in_multiarray($elem, $array)
    {
        // if the $array is an array or is an object
         if( is_array( $array ) || is_object( $array ) )
         {
             // if $elem is in $array object
             if( is_object( $array ) )
             {
                 $temp_array = get_object_vars( $array );
                 if( in_array( $elem, $temp_array ) )
                     return TRUE;
             }

             // if $elem is in $array return true
             if( is_array( $array ) && in_array( $elem, $array ) )
                 return TRUE;


             // if $elem isn't in $array, then check foreach element
             foreach( $array as $array_element )
             {
                 // if $array_element is an array or is an object call the in_multiarray function to this element
                 // if in_multiarray returns TRUE, than return is in array, else check next element
                 if( ( is_array( $array_element ) || is_object( $array_element ) ) && $this->in_multiarray( $elem, $array_element ) )
                 {
                     return TRUE;
                     exit;
                 }
             }
         }

         // if isn't in array return FALSE
         return FALSE;
    }
?>

मायावी समाधान बेहतर है क्योंकि यह केवल सरणियों के लिए है
गज़िलियन

1

यहाँ मेरा प्रस्ताव json_encode () समाधान पर आधारित है :

  • केस असंवेदनशील विकल्प
  • सच के बजाय गिनती लौट रही है
  • कहीं भी सरणियों (चाबियाँ और मूल्य)

यदि शब्द नहीं मिला, यह अभी भी रिटर्न 0 के बराबर झूठी

function in_array_count($needle, $haystack, $caseSensitive = true) {
    if(!$caseSensitive) {
        return substr_count(strtoupper(json_encode($haystack)), strtoupper($needle));
    }
    return substr_count(json_encode($haystack), $needle);
}

आशा करता हूँ की ये काम करेगा।


ध्यान दें कि यह फ़ंक्शन सबस्ट्रिंग से भी मेल खाता है: पूर्व 00में 10000या loमें Hello। इसके अलावा असफल होjson_encode जाएगा सुई में कोई भी चरित्र है जो बच जाता है , जैसे दोहरे उद्धरण।
पाओलो

बेशक यह निर्भर करता है कि आप क्या करेंगे, लेकिन मेरे लिए इस समाधान में तेजी से निष्पादन है और यह पर्याप्त है।
मेलमैन

1

मेरा मानना ​​है कि आप आजकल array_key_exists का उपयोग कर सकते हैं:

<?php
$a=array("Mac"=>"NT","Irix"=>"Linux");
if (array_key_exists("Mac",$a))
  {
  echo "Key exists!";
  }
else
  {
  echo "Key does not exist!";
  }
?>

1

मैं एक ऐसे फंक्शन की तलाश में था, जो मुझे ऐरे ( हिस्टैक ) में स्ट्रिंग्स और एरेज़ (सुई के रूप में) दोनों की खोज करने दे , इसलिए मैंने @jwueller द्वारा उत्तर में जोड़ा

यहाँ मेरा कोड है:

/**
 * Recursive in_array function
 * Searches recursively for needle in an array (haystack).
 * Works with both strings and arrays as needle.
 * Both needle's and haystack's keys are ignored, only values are compared.
 * Note: if needle is an array, all values in needle have to be found for it to
 * return true. If one value is not found, false is returned.
 * @param  mixed   $needle   The array or string to be found
 * @param  array   $haystack The array to be searched in
 * @param  boolean $strict   Use strict value & type validation (===) or just value
 * @return boolean           True if in array, false if not.
 */
function in_array_r($needle, $haystack, $strict = false) {
     // array wrapper
    if (is_array($needle)) {
        foreach ($needle as $value) {
            if (in_array_r($value, $haystack, $strict) == false) {
                // an array value was not found, stop search, return false
                return false;
            }
        }
        // if the code reaches this point, all values in array have been found
        return true;
    }

    // string handling
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle)
            || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }
    return false;
}

0

यह भी मूल एक से एक नया अपरिमेय सरणी बनाने का काम करता है।

$arr = array("key1"=>"value1","key2"=>"value2","key3"=>"value3");

foreach ($arr as $row)  $vector[] = $row['key1'];

in_array($needle,$vector);

0

डेटाबेस परिणाम सेट के आधार पर बनाए गए बहुआयामी सरणियों के लिए छोटा संस्करण।

function in_array_r($array, $field, $find){
    foreach($array as $item){
        if($item[$field] == $find) return true;
    }
    return false;
}

$is_found = in_array_r($os_list, 'os_version', 'XP');

यदि $ os_list सरणी में os_version फ़ील्ड में 'XP' शामिल है, तो वापस आ जाएगी।


0

मुझे वास्तव में छोटा सा सरल समाधान मिला:

यदि आपकी सरणी है:

Array
(
[details] => Array
    (
        [name] => Dhruv
        [salary] => 5000
    )

[score] => Array
    (
        [ssc] => 70
        [diploma] => 90
        [degree] => 70
    )

)

फिर कोड इस तरह होगा:

 if(in_array("5000",$array['details'])){
             echo "yes found.";
         }
     else {
             echo "no not found";
          }

0

मैंने इस पद्धति का उपयोग किसी भी संख्या में नेस्टेड के लिए किया है और हैकिंग की आवश्यकता नहीं है

<?php
    $blogCategories = [
        'programing' => [
            'golang',
            'php',
            'ruby',
            'functional' => [
                'Erlang',
                'Haskell'
            ]
        ],
        'bd' => [
            'mysql',
            'sqlite'
        ]
    ];
    $it = new RecursiveArrayIterator($blogCategories);
    foreach (new RecursiveIteratorIterator($it) as $t) {
        $found = $t == 'Haskell';
        if ($found) {
           break;
        }
    }

-1

प्रयास करें:

in_array("irix",array_keys($b))
in_array("Linux",array_keys($b["irix"])

Im जरूरत के बारे में निश्चित नहीं है, लेकिन यह आपकी आवश्यकता के लिए काम कर सकता है


2
सरणी कुंजियों की खोज कुछ भी कैसे करेगी? $bसरणी कुंजियाँ सिर्फ पूर्णांक हैं ... इन सरणियों में कोई निर्दिष्ट कुंजी नहीं हैं ... और array_keys($b["irix"])बस एक त्रुटि फेंक देंगे, क्योंकि $b["irix"]मौजूद नहीं है।
बेन डी

-1

array_search के बारे में क्या? लगता है कि यह https://gist.github.com/Ocramius/1290076 के अनुसार फॉर्चून से काफी तेज है ।

if( array_search("Irix", $a) === true) 
{
    echo "Got Irix";
}

वास्तव में array_search पुनरावर्ती नहीं है, इसलिए यह काम नहीं करता है। काश, यह बहुत साफ और सरल होता है। php.net/manual/en/function.array-search.php
मैथ्यू ली जूल

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.