2012-12-27 13 views
7

के खिलाफ एक पुनरावर्ती/बहुआयामी सरणी मिलान मैं निम्नलिखित सरणी ($example_array नीचे कहा जाता है):एक और सरणी

array(3) { 
    ["id"]=> string(4) "123" 
    ["name"]=> 
     array(1) { 
     ["first"]=> string(3) "pete" 
     ["last"]=> string(3) "foo" 
     } 
    ["address"]=> 
     array(1) { 
     ["shipping"]=> 
      array(1) { 
       ["zip"]=> string(4) "1234" 
       ["country"]=> string(4) "USA" 
      } 
     } 
} 

मैं एक समारोह है कि मैं इस तरह सरणियों के खिलाफ चलाने के लिए और एक मैच के लिए देख सकते करना चाहते हैं। यहाँ खोजें कि मैं प्रदर्शन करने में सक्षम होना चाहते हैं कर रहे हैं:

// These should return true: 
search($example_array, array('id' => '123')); 
search($example_array, array('name' => array('first' => 'pete')); 
search($example_array, array('address' => array('shipping' => array('country' => 'USA'))); 

// These don't have to return true: 
search($example_array, array('first' => 'pete')); 
search($example_array, array('country' => 'USA')); 

वहाँ एक PHP आंतरिक समारोह है कि मैं का उपयोग कर सकते है या मैं कुछ अपने आप को कोड करने के लिए करना होगा?

+0

उन तीन सरणियों कि सरणी में मिलान किया जाना चाहिए या अलग से कर रहे हैं? मिलान का तर्क क्या है? क्या आइटम मिलान किया जाना चाहिए यदि उनमें से एक सरणी में है जिसे खोजा जाना चाहिए या उन सभी का मिलान किया जाना चाहिए? – Leri

+0

अलग-अलग, प्रत्येक खोज की एक उदाहरण है जिसे उदाहरण सरणी के विरुद्ध किया जा सकता है। –

+0

डेटाबेस नौकरी की तरह दिखता है –

उत्तर

7
function search($array, $b) { 
    $ok = true; 
    foreach ($b as $key => $value) { 
     if (!isset($array[$key])) { $ok = false; break; } 
     if (!is_array($value)) 
      $ok = ($array[$key] == $value); 
     else 
      $ok = search($array[$key], $value); 
     if ($ok === false) break; 
    } 
    return $ok; 
} 

यहां test script है।

+0

पूरी तरह से काम करता है। धन्यवाद! –

+1

पढ़ने और बिंदु पर आसान है। +1 – didierc

0

आप जो चाहते हैं उसे करने के लिए कोई अंतर्निहित नहीं है, iirc।

यहाँ array_walk के साथ एक (untested) संस्करण है:

function search($data,$match) { 
    return array_walk($match, function($v,$k) use ($data) { 
     if (isset($data[$k])){ 
     if (is_array($v)) return search($data[$k],$v); 
     return ($v == $data[$k]); 
     }); 
     return false; 
} 

यह कुछ हद तक संक्षिप्त है (एक ?: साथ बेहतर हो सकता है), लेकिन शायद बहुत पठनीय नहीं। Lambdas PHP के लिए एक महान इसके अलावा हैं!

यहाँ एक और संभव समाधान है, लेकिन प्रतीत होता है (यदि आप सुनिश्चित करने के लिए बेंचमार्क चाहिए) inneficient:

function search($d,$m) { 
    return is_empty(array_diff_assoc(array_intersect_assoc($d,$m), $m)); 
} 

शायद यह अगर इस्तेमाल किया builtin recursives नहीं हैं काम नहीं करेगा।

1

आशा इस समारोह में मदद करता है:

public function matchArray(&$arrayToSearch, $valueToMatch = array()){ 
    if(!is_array($valueToMatch)) 
     $valueToMatch = array($valueToMatch); 

    $exists = false; 
    $indexToMatch = array_keys($valueToMatch); 

    foreach($indexToMatch as $ind){ 
     if(array_key_exists($ind, $arrayToSearch)){ 
      $valToMatch = $valueToMatch[$ind]; 
      $value = $arrayToSearch[$ind]; 
      $valType = gettype($value); 
      $valToMatch = $valueToMatch[$ind]; 
      if($valType == gettype($valToMatch) || is_numeric($valToMatch)){ 
       if($valType == 'array'){ 
        $exists = $this->matchArray($value, $valToMatch); 
       } else if(($valType == 'string' || is_numeric($valToMatch)) && $valToMatch == $value) { 
        $exists = true; 
       } else { 
        $exists = false; 
        break; 
       } 
      } 
     } 
    } 

    return $exists; 
}