2011-07-03 7 views
6

मैं एक दूसरे के साथ दो सरणियों विलय करना चाहते हैं:दूसरी सरणी से केवल मानों को ले कर दो सरणी कैसे विलय करें जिसमें पहले की तरह एक ही कुंजी है?

$merged = array(1 => 'a', 3 => 'c*'); 
:

$filtered = array(1 => 'a', 3 => 'c'); 
$changed = array(2 => 'b*', 3 => 'c*'); 

जबकि मर्ज $filtered के सभी तत्वों और $changed के उन सभी तत्वों $filtered में एक इसी कुंजी है को शामिल करना चाहिए

array_merge($filtered, $changed)$changed की अतिरिक्त कुंजी भी $filtered में जोड़ देगा। तो यह वास्तव में फिट नहीं है।

मुझे पता है कि मैं $keys = array_intersect_key($filtered, $changed) का उपयोग उन दोनों सरणी में मौजूद कुंजी प्राप्त करने के लिए कर सकता हूं जो पहले से ही काम के आधे हैं।

हालांकि मैं अगर कोई (देशी) समारोह है कि array_intersect_key द्वारा निर्दिष्ट $keys साथ एक सरणी में $changed सरणी को कम कर सकते है सोच रहा हूँ? मुझे पता है कि मैं कॉलबैक फ़ंक्शन के साथ array_filter का उपयोग कर सकता हूं और उसमें $keys के विरुद्ध जांच कर सकता हूं, लेकिन शायद उन तत्वों को निकालने के लिए कुछ अन्य शुद्ध रूप से देशी फ़ंक्शन हैं जिनकी चाबियाँ निर्दिष्ट की जा सकती हैं?

मैं पूछ रहा हूं क्योंकि मूल कार्य अक्सर कॉलबैक के साथ array_filter से अधिक तेज़ होते हैं।

उत्तर

13

यह है, यह क्या करना चाहिए अगर मैं अपने तर्क को सही ढंग से समझ रहा हूँ:

array_intersect_key($changed, $filtered) + $filtered 

कार्यान्वयन:

$filtered = array(1 => 'a', 3 => 'c'); 
$changed = array(2 => 'b*', 3 => 'c*'); 
$expected = array(1 => 'a', 3 => 'c*');  
$actual = array_key_merge_deceze($filtered, $changed); 

var_dump($expected, $actual); 

function array_key_merge_deceze($filtered, $changed) { 
    $merged = array_intersect_key($changed, $filtered) + $filtered; 
    ksort($merged); 
    return $merged; 
} 

आउटपुट:

Expected: 
array(2) { 
    [1]=> 
    string(1) "a" 
    [3]=> 
    string(2) "c*" 
} 

Actual: 
array(2) { 
    [1]=> 
    string(1) "a" 
    [3]=> 
    string(2) "c*" 
} 
+0

चौराहे के खिलाफ संघ भी कोशिश कर सकते हैं। लेकिन संघ '$ फ़िल्टर किए गए' के ​​साथ-साथ AFAIK की कुंजी भी जोड़ देगा। मै उसे करने की एक कोशिश तो करूंगा। – hakre

+0

मैंने सोचा कि '$ फ़िल्टर किए गए 'की चाबियाँ जोड़ना बिंदु था ...? – deceze

+0

जुप। मैंने अभी इसका परीक्षण किया, मेरी गलती;)। यह बहुत अच्छी तरह से काम करता है, केवल चाबियों का क्रम बदलता है, लेकिन यह कोई समस्या नहीं है क्योंकि मेरे पास उन्हें संख्यात्मक अनुक्रमणिका के रूप में है, इसलिए ksort नौकरी करता है। उत्तम। आपका बहुत बहुत धन्यवाद! – hakre

0

अगर आप चाहते हैं दूसरी सरणी ($ बी) इंडिका के पैटर्न होने के लिए tes कि अगर वहाँ केवल कुंजी है, तो आप इस

$new_array = array_intersect_key($filtered, $changed) + $changed; 
संबंधित मुद्दे