PHP: रीइन्डेक्सिंग के बजाय चाबियाँ रखते हुए दो सरणियों को मर्ज करें?


255

स्ट्रिंग / इंट कीज़ को रखते हुए मैं दो सरणियों (स्ट्रिंग के साथ एक) = वैल्यू पेयर और दूसरा इंट (> वैल्यू पेयर) के साथ कैसे विलय कर सकता हूं? उनमें से कोई भी कभी भी ओवरलैप नहीं होगा (क्योंकि एक में केवल तार होते हैं और दूसरे में केवल पूर्णांक होते हैं)।

यहाँ मेरा वर्तमान कोड है (जो काम नहीं करता है, क्योंकि array_merge पूर्णांक कुंजियों के साथ सरणी को फिर से अनुक्रमित कर रहा है):

// get all id vars by combining the static and dynamic
$staticIdentifications = array(
 Users::userID => "USERID",
 Users::username => "USERNAME"
);
// get the dynamic vars, formatted: varID => varName
$companyVarIdentifications = CompanyVars::getIdentificationVarsFriendly($_SESSION['companyID']);
// merge the static and dynamic vars (*** BUT KEEP THE INT INDICES ***)
$idVars = array_merge($staticIdentifications, $companyVarIdentifications);

1
यह अजीब है: PHP डॉक्टर पृष्ठ के अनुसार, array_merge को ऐसा नहीं करना चाहिए । क्या स्ट्रिंग कुंजियाँ वास्तव में स्ट्रिंग पूर्णांक का प्रतिनिधित्व करती हैं?
ओवेनमर्शाल

array_merge मेरे दूसरे एरे को रिजेक्ट कर रहा है। अर्थात। यह सरणी को बदल रहा array( 123 => "VALUE123" )हैarray( 0 => "VALUE123" )
Garrett

हम्म, यह दिलचस्प है। मुझे लगता है कि PHP प्रलेखन उस बिंदु पर थोड़ा अस्पष्ट हो सकता है। यह कहता है कि यदि सभी सरणियों में संख्यात्मक कुंजियाँ होंगी तो क्या होगा, लेकिन यह विशेष रूप से यह नहीं कहता है कि यदि वे नहीं करते हैं तो क्या होगा।
स्टीवन ऑक्सले

शायद 2 साल पहले नहीं। लेकिन 2012 में, इस बिंदु पर प्रलेखन क्रिस्टल स्पष्ट है।
कार्टिफ़ॉफ़ोर्स

असल में, प्रलेखन अभी भी स्पष्ट नहीं है। "न्यूमेरिक" में वास्तव में सभी अंकों (PHP 5.3.3) के साथ एक स्ट्रिंग शामिल है। assert(array(0=>0,1=>1) === array_merge(array('9'=>0), array('9'=>1)))
बॉब स्टीन

जवाबों:


557

आप बस सारणियों को 'जोड़' सकते हैं:

>> $a = array(1, 2, 3);
array (
  0 => 1,
  1 => 2,
  2 => 3,
)
>> $b = array("a" => 1, "b" => 2, "c" => 3)
array (
  'a' => 1,
  'b' => 2,
  'c' => 3,
)
>> $a + $b
array (
  0 => 1,
  1 => 2,
  2 => 3,
  'a' => 1,
  'b' => 2,
  'c' => 3,
)

44
इस के साथ बहुत सावधान रहें! + ऑपरेटर एक जोड़ नहीं है, यह एक संघ है। यदि चाबियां ओवरलैप नहीं होती हैं, तो सब अच्छा है, लेकिन अगर वे करते हैं ...
गॉर्डन

3
बस वाह - आपने मुझे करीब तीन साल तक कोड की लाइनों की बाल्टियाँ बचाईं।
स्टीफन ओ'फ्लिन

85
किसी के मामले में अगर वे ओवरलैप करते हैं तो क्या होगा? : php.net: "+ ऑपरेटर बाएं हाथ के सरणी में जोड़े गए दाहिने हाथ के सरणी को लौटाता है; दोनों सरणियों में मौजूद कुंजियों के लिए, बाएं हाथ के सरणी से तत्वों का उपयोग किया जाएगा, और दाएं से मिलान करने वाले तत्व। -हैंड अरेंजमेंट को नजरअंदाज किया जाएगा। ”
फ्लिऑन

2
@ यह उससे अधिक जटिल है। '+' का उपयोग करते हुए, मैंने एक सामान्य कुंजी और उपकुंजी के साथ एक तत्व के साथ दो उप-सरणियों को जोड़ा है: मान जोड़े गए! 100000 => सरणी (आकार = 3) 1 => int 128 2 => int 56 3 => int 7 + 100000 => सरणी (आकार = 1) 2 => int 30 परिणाम: 100000 => सरणी (आकार = 3) 1 => int 128 2 => int 86 3 => int 7 मूल रूप से [2 => 56] + [2 => 30] जोड़कर मूल्य को प्रतिस्थापित नहीं किया बल्कि इसे जोड़ा और [2 => 86]
दारियो फुमगल्ली

1
@DarioFumagalli मैं नहीं जानता कि क्या मैं गलतफहमी हूँ या अगर यह 2016 के बाद से बदल गया है, लेकिन इस समय, ऑपरेशन में print_r([2 => 56] + [2 => 30]);पैदावार होती है Array ( [2] => 56 )। तो, यह बाएं हाथ की ओर निर्दिष्ट के रूप में रख रहा है। यह PHP 7.1.19 की तरह है, जो repl.it पर चल रहा है ।
चार्ल्स वुड

62

जिसको देखते हुए आपके पास है

$replaced = array('1' => 'value1', '4' => 'value4');
$replacement = array('4' => 'value2', '6' => 'value3');

कर $merge = $replacement + $replaced;इच्छा उत्पादन:

Array('4' => 'value2', '6' => 'value3', '1' => 'value1');

योग से पहली सरणी में अंतिम आउटपुट में मान होंगे।

कर $merge = $replaced + $replacement;इच्छा उत्पादन:

Array('1' => 'value1', '4' => 'value4', '6' => 'value3');

[[थम्सअप]] इस पर
झौरलाड एस्ट्रेला

21
2 सरणियों को जोड़ते समय योग करने के लिए, दूसरे से पहले ओवरराइड मान से मान।
डेजीमिड

1
मुझे लगा कि दूसरा पहला ओवरराइड करेगा। :)
असीम केटी

1
बिल्कुल सही। इसलिए मैं उपयोग नहीं कर सका $allValues += $newValues;
MarthM

करना $merge = $replacement + $replaced;होगा आउटपुट:Array ( [4] => value2 [6] => value3 [1] => value1 )
चंदन शर्मा

24

जबकि यह प्रश्न काफी पुराना है, मैं सिर्फ चाबियाँ रखते हुए मर्ज करने की एक और संभावना जोड़ना चाहता हूं।

मौजूदा सरणियों में कुंजी / मानों को जोड़ने के अलावा, +साइन का उपयोग करके आप एक कर सकते हैं array_replace

$a = array('foo' => 'bar', 'some' => 'string');
$b = array(42 => 'answer to the life and everything', 1337 => 'leet');

$merged = array_replace($a, $b);

परिणाम होगा:

Array
(
  [foo] => bar
  [some] => string
  [42] => answer to the life and everything
  [1337] => leet
)

उसी कुंजियों को बाद की सरणी द्वारा अधिलेखित कर दिया जाएगा।
वहाँ भी एक है array_replace_recursive, जो यह सबरेज़ के लिए भी करता है।

3v4l.org पर लाइव उदाहरण


3

दो सरणियों को आसानी से जोड़ा जा सकता है या संघ द्वारा उनके मूल अनुक्रमण को + ऑपरेटर द्वारा जप के बिना जोड़ा जा सकता है । यह लार्वा और कोडिग्नेट चयन ड्रॉपडाउन में पूरी मदद करेगा।

 $empty_option = array(
         ''=>'Select Option'
          );

 $option_list = array(
          1=>'Red',
          2=>'White',
          3=>'Green',
         );

  $arr_option = $empty_option + $option_list;

आउटपुट होगा:

$arr_option = array(
   ''=>'Select Option'
   1=>'Red',
   2=>'White',
   3=>'Green',
 );

1

Array_replace_recursive या array_replace फ़ंक्शन आज़माएं

$a = array('userID' => 1, 'username'=> 2);
array (
  userID => 1,
  username => 2
)
$b = array('userID' => 1, 'companyID' => 3);
array (
  'userID' => 1,
  'companyID' => 3
)
$c = array_replace_recursive($a,$b);
array (
  userID => 1,
  username => 2,
  companyID => 3
)

http://php.net/manual/en/function.array-replace-recursive.php

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