2012-07-25 23 views
16

मैं एक सरणी है कि देशों है:सरणी सरणी में कुंजी पर छेड़छाड़?

array(
'AF'=>'AFGHANISTAN', 
'AL'=>'ALBANIA', 
'DZ'=>'ALGERIA', 
'AS'=>'AMERICAN SAMOA', 
); 

और मैं एक सरणी में कुंजी के कुछ है कि

array('AL', 'DZ'); 

मैं एक समारोह है कि मानकों के रूप में दोनों सरणियों ले जाएगा कॉल करना चाहते है और वापसी

array(
'AL'=>'ALBANIA', 
'DZ'=>'ALGERIA', 
); 

मैं जानता हूँ कि php चाबियाँ, या मानों की तुलना करने कार्यों में निर्माण किया है, लेकिन ऐसा लगता है उन कार्यों सब उम्मीद आप हेक्टेयर दो 1 डी arrays 'या दो 2 डी arrays हैं।

मैं पहली सरणी के लिए array_keys() से अधिक पाश सकता है और प्रत्येक कुंजी पर एक in_array() जांच करते हैं, लेकिन वह वास्तव में inefficent लगता है ...

उत्तर

39
$selection = array('AL', 'DZ'); 
$filtered = array_intersect_key($countries, array_flip($selection)); 
var_dump($filtered); 
+0

मुझे दो बार देखना था, लेकिन यह एक बहुत अच्छा, छोटा समाधान है। +1 –

+0

@deceze - अच्छा समाधान - क्या नए सरणी मिलान में सभी मानों की गणना करने का एक प्रभावी तरीका है (उदाहरण के लिए, एक चेक: $ चयन = सरणी ('AL', 'AF', 'DZ', ' एएस '); – JM4

+2

@ जेएम 4 हां,' छेड़छाड़ 'के बजाय' diff' करें। – deceze

-2

अगर मैं सही ढंग से समझ में आ आप देशों की सरणी और जरूरत देशों की सरणी और आपके पास आवश्यक देशों के साथ सरणी बनाना चाहते हैं। यदि ऐसा है, तो आप इसे आजमा सकते हैं:

$countries = array ("AF"=>"AFGJANISTAN", "AL"=>"ALBANIA", "LV"=>"LATVIA", "USA"=>"UNITED STATES OF AMERICA"); 
$needed = array ("AF", "AL"); 

$result = array(); 
foreach ($needed as $row) { 
    if (in_array($row, $contries)) { 
     $result[] = $countries[$row]; 
    } 
} 
var_dump($result); 
+0

यह गलत उत्तर है। कृपया, पढ़ें कि 'in_array' फ़ंक्शन http://php.net/manual/en/function.in-array.php –

4

सेकंड सरणी पर बस लूप करें, और पहले मानों को प्राप्त करें। वैसे विपरीत वास्तव में अनावश्यक अक्षम लगता है।

तो:

$Arr1 = array(
'AF'=>'AFGHANISTAN', 
'AL'=>'ALBANIA', 
'DZ'=>'ALGERIA', 
'AS'=>'AMERICAN SAMOA', 
); 

$Arr2 = array('AL', 'DZ'); 

$result = array(); 
foreach ($Arr2 as $cc){ 
    if (isset($Arr1[$cc])){ 
    $result[$cc] = $Arr1[$cc]; 
    } 
} 
print_r($result); 

मुझे नहीं लगता कि अक्षम है।

अतिरिक्त संपादित करें: यदि आप 100% सुनिश्चित हैं कि $ Arr2 में केवल कोड हैं जो $ Arr1 में पाए जा सकते हैं, तो आप निश्चित रूप से जारीकर्ता() परीक्षण छोड़ सकते हैं।

+2

+1 पर दक्षता के लिए कैसे काम करता है, हालांकि मैं अपने चौराहे दृष्टिकोण को अधिक संक्षिप्त और संभवतः पर्याप्त रूप से पर्याप्त पसंद करता हूं। .. :) – deceze

+0

@deceze: व्यक्तिगत रूप से मुझे आपके दृष्टिकोण को समझने के लिए और अधिक समय चाहिए। हालांकि यह छोटा है (कोड की रेखाएं) मुझे इसके बारे में दो बार सोचना चाहिए। यह उदाहरण के लिए गायब प्रविष्टियों को कैसे संभालता है। दो बार सोचने के बाद मुझे लगता है कि यह उन्हें ठीक से संभालता है। ;-) अच्छा समाधान! –

-1

मुझे लगता है कि इससे मदद मिलेगी। यहां एक फ़ंक्शन key_values_intersect है जो आपको अपेक्षित काम करेगा :)

$longcodes = array(
    'AF' => 'AFGHANISTAN', 
    'AL' => 'ALBANIA', 
    'DZ' => 'ALGERIA', 
    'AS' => 'AMERICAN SAMOA', 
); 

$code = array('AL', 'DZ'); 

function key_values_intersect($haystack, $needle) 
{ 
    $tmp=array(); 
    foreach ($needle AS $key) { 
     $tmp[$key] = $haystack[$key]; 
    } 
    return $tmp; 
} 


print_r(key_values_intersect($longcodes,$code)); 
संबंधित मुद्दे