2011-08-18 17 views
5

मेरे पास एक सहयोगी सरणी और चाबियाँ हैं।PHP में कुंजी की सरणी का उपयोग करके एक सहयोगी सरणी को फ़िल्टर कैसे करें?

$A = array('a'=>'book', 'b'=>'pencil', 'c'=>'pen'); 
$B = array('a', 'b'); 

मैं $A के सभी तत्व जहां कुंजी $B में है से एक साहचर्य सरणी का निर्माण कैसे? ऊपर उदाहरण के लिए, इस सवाल का जवाब

$C = array('a'=>'book', 'b'=>'pencil'); 

उत्तर

2
$keys = array_keys($B); 
$C = array(); 
foreach ($A as $key => $value) 
{ 
    if (in_array($key, $keys)) 
    { 
    $C[$key] = $value; 
    } 
} 
+0

उत्तर के लिए धन्यवाद। – Fazri

2

होना चाहिए यहाँ एक सरल उपाय है जो की जाँच करता है $C

$A = array('a'=>'book', 'b'=>'pencil', 'c'=>'pen'); 
$B = array('a', 'b'); 

$C = array(); 
foreach ($B as $bval) { 
    // If the $B key exists in $A, add it to $C 
    if (isset($A[$bval])) $C[$bval] = $A[$bval]; 
} 

var_dump($C); 

// Prints: 
array(2) { 
    ["a"]=> 
    string(4) "book" 
    ["b"]=> 
    string(6) "pencil" 
} 
+0

जाहिर गलत:/

निम्नलिखित त्वरित बेंचमार्क स्क्रिप्ट मुझे परिणाम देता है। ओपी को एक सरणी को दूसरे के साथ फ़िल्टर करने की आवश्यकता है, आपका समाधान नहीं है। और '$ C' में परिणाम एक सहयोगी सरणी होना चाहिए, आपके समाधान में यह एक अनुक्रमित है। –

+0

'$ C' सहयोगी –

+0

बनाने के लिए संपादित किया गया स्पष्ट रूप से काम कर रहा है;) –

3

array_intersect_key($A,array_combine($B,$B))

या करने के लिए इसे जोड़कर पहले कि कुंजी $A में मौजूद है बेहतर: array_intersect_key($my_array, array_flip($allowed))

,210

सवाल से: PHP: How to use array_filter() to filter array keys?

16
$keys = array_flip($B); 
$C = array_intersect_key($A,$keys); 
1

मेरी अपार आश्चर्य करने के लिए, foreach पाश विधि तेज है। array_intersect_key: 0.76424908638 foreach loop: 0.6393928527832

$A = array('a'=>'book', 'b'=>'pencil', 'c'=>'pen'); 
$B = array('a', 'b'); 

$start = microtime(true); 
for ($i = 0 ; $i < 1000000; $i++) { 
$c = array_intersect_key($A,array_flip($B)); 
} 

$t1 = microtime(true); 

for ($i = 0; $i < 1000000; $i++) { 
$C = array(); 
    foreach ($B as $bval) { 
      // If the $B key exists in $A, add it to $C 
      if (isset($A[$bval])) $C[$bval] = $A[$bval]; 
    } 
} 

$t2 = microtime(true); 
echo "array_intersect_key: " . ($t1 - $start), "\n"; 
echo "foreach loop: " . ($t2 - $t1), "\n"; 
+1

बहुत बढ़िया \ o/(और कुछ और पात्र 15 तक पहुंचने के लिए)। –