Array_merge और array + array में क्या अंतर है?


116

एक काफी सरल सवाल। के बीच क्या अंतर है:

$merged = array_merge($array1, $array2);

तथा

$merged = $array1 + $array2;

?



3
शायद गॉर्डन, चूक गए कि शीर्षक के कारण इसमें array_merge नहीं था।
Pixel Developer

जवाबों:


73

अंतर यह है:

+ऑपरेटर, दो सरणियों के मिलन लेता है, जबकि array_mergeसमारोह संघ लेता है लेकिन डुप्लिकेट चाबी ओवरराइट कर रहे हैं।


तो, इन 2 के बीच क्या अंतर है: array_merge , plus sign (हालांकि मुझे सरणियों के चारों ओर स्विच करना पड़ा)?
जोसेफ सिलबर

15
यहां शुरुआती लोगों के लिए सावधानी का एक शब्द, दोनों मामलों में ऑपरेशन का परिणाम शून्य है यदि किसी भी एक सरणियों में शून्य है । कुछ इस संभालने के बारे में परवाह नहीं हो सकता है क्योंकि यह एक संघ ऑपरेशन है, परिणाम उचित नहीं है (-नल) सरणी हो सकता है अगर उनमें से एक है अशक्त । लेकिन, यह सही है अगर कोई एक सरणी खाली सरणी है। इसलिए, एक अच्छे अभ्यास के रूप में, मुझे लगता है, हमें खाली सरणियों के रूप में इनपुट सरणियों को आरंभ करना चाहिए। आप लोग क्या कहते हैं?
संदीपन नाथ

6
यदि डुप्लिकेट कुंजियाँ हैं, तो "यूनियन लेना" हमेशा उनमें से एक से छुटकारा पाना होगा। अंतर है जिसमें एक।
एलेक्सिस

5
क्षमा करें, यह उत्तर भ्रमित करने वाला, गलत और अपूर्ण है। : -देखो @ एलेक्सिस की टिप्पणी भ्रमित करने वाली बिट के बारे में है (हालाँकि ओपी के बारे में उसकी सच्चाई भी सिर्फ आधी है)। 2. वास्तव में क्या करता है, इसके बारे में येहोसफ का जवाब देखें ... 3. और यहां उल्लिखित एक और महत्वपूर्ण अंतर के बारे में बोल्टकॉक का जवाब नहीं देखें: इसके विपरीत, संख्यात्मक कुंजी को रीसेट करता है । array_merge array_merge+
एस.जे.

विशिष्ट बिल्कुल नहीं। अनुपयोगी। अंतर को उजागर नहीं करता है। एक स्पष्टीकरण के उच्च स्तर।
१biz:५३ पर एहनबीजक

90

यहाँ एक सरल उदाहरण परीक्षण है:

$ar1 = [
   0  => '1-0',
  'a' => '1-a',
  'b' => '1-b'
];


$ar2 = [
   0  => '2-0',
   1  => '2-1',
  'b' => '2-b',
  'c' => '2-c'
];

print_r($ar1+$ar2);

print_r(array_merge($ar1,$ar2));

नतीजे के साथ:

Array
(
  [0] => 1-0
  [a] => 1-a
  [b] => 1-b
  [1] => 2-1
  [c] => 2-c
)
Array
(
  [0] => 1-0
  [a] => 1-a
  [b] => 2-b
  [1] => 2-0
  [2] => 2-1
  [c] => 2-c
)

ध्यान दें कि गैर-संख्यात्मक कुंजियों का डुप्लिकेट यूनियन ऑपरेटर का उपयोग करके पहला मान लेगा, लेकिन बाद में array_merge का उपयोग करके।

संख्यात्मक कुंजियों के लिए, पहले मूल्य का उपयोग यूनियन ऑपरेटर के साथ किया जाएगा, जबकि सभी मानों को array_merge के साथ उपयोग किया जाएगा, बस reindexed।

मैं आम तौर पर सांख्यिक सरणियों और संख्यात्मक के लिए array_merge के लिए यूनियन ऑपरेटर का उपयोग करता हूं। बेशक, आप बस साहचर्य के लिए array_merge का उपयोग कर सकते हैं, बस इसके बाद के मान पहले वाले को अधिलेखित कर देते हैं।


52

array_merge()इनपुट सारणियों में पाई जाने वाली सभी संख्यात्मक कुंजियों को परिणामी सरणी में reindexed किया जाता है। संघ का संचालक+ रीइंडेक्स का कारण नहीं बनता है।


29

array_merge बनाम प्लस

स्रोत: https://softonsofa.com/php-array_merge-vs-array_replace-vs-plus-aka-union/

Array_merge ($ चूक, $ विकल्प) का उपयोग करना बंद करें:

function foo(array $options)
{
   $options += ['foo' => 'bar'];

   // ...
}

नोट : array_replace फ़ंक्शन PHP5.3 के बाद से मौजूद है।


हमें array_merge ($ डिफ़ॉल्ट, $ विकल्प) का उपयोग क्यों रोकना चाहिए:? क्योंकि यह गैर-अनुक्रमित कुंजियों को अस्वीकार करता है?
एहनबीकैड

लेकिन जवाब वास्तव में प्रचलित है +1
snr

20

+ साइन केवल एक सरणी कुंजी की पहली घटना से मान लेता है ।
array_merge एक अरै की की के अंतिम घटना से मान लेता है ।

उदाहरण:

$first = ['a'=>'one',
        'b'=>'two',
        'c'=>'three'];

$second = ['a'=>'fourth',
        'b'=>'fifth',
        'c'=>'sixth',
        '3'=>'number three'];

$merged = $first + $second;
echo "<pre> plus sign merge\n";
var_dump($merged);

$merged = array_merge($first,$second);
echo "\n array_merge function merge\n";
var_dump($merged);

यह आउटपुट:

प्लस साइन मर्ज
एरे (4) {
["ए" =>
स्ट्रिंग (3) "एक"
["बी"] =>
स्ट्रिंग (3) "दो"
["सी"] =>
स्ट्रिंग (5) "तीन"
[३] =>
स्ट्रिंग (१२) "नंबर तीन"
}

array_merge फ़ंक्शन मर्ज
सरणी (4) {
["a" =>
स्ट्रिंग (6) "चौथा"
["बी"] =>
स्ट्रिंग (5) "पांचवां"
["सी"] =>
स्ट्रिंग (5) "छठा"
[०] =>
स्ट्रिंग (१२) "नंबर तीन"
}

इसमें ध्यान देने वाली बात यह है कि array_mergeएक्टली मिट जाती है , '3' तीन भले ही यह एक स्ट्रिंग है संख्या के सूचकांक क्योंकि यह एक संख्या है।

इसलिए विलय के समय ध्यान रखें array_merge संख्यात्मक सूचकांक के सरणियों के साथ । वे अपनी चाबी खो सकते हैं। यदि वे आपके लिए महत्वपूर्ण हैं, तो उन्हें एक स्ट्रिंग के साथ पूर्ववर्ती करें।

इसलिए इसके बजाय '3' => 'three'कुछ का उपयोग करें'_3' => 'three'


5
" भले ही यह एक स्ट्रिंग है, क्योंकि यह एक नंबर है " एक +1 का हकदार है :-)
e2-e4

5

मेरा मानना ​​है कि array_mergeडुप्लिकेट नॉन_न्यूमेरिक कीज़ को ओवरराइट $array1 + $array2करता है जबकि ऐसा नहीं करता।


3

फिर भी एक और उदाहरण (स्पष्ट कुंजियों के बिना सरणियाँ; यह ऑपरेटर +और array_mergeकाम करने के तरीके के बारे में स्पष्ट है , लेकिन जब "स्पष्ट" चीजें सरल होती हैं;))

$a = array('apple');
$b = array('orange', 'lemon');

echo '$a + $b = ';             print_r($a + $b);
echo 'array_merge($a, $b) = '; print_r(array_merge($a, $b));

दे देंगे:

$a + $b = Array
(
    [0] => apple
    [1] => lemon
)
array_merge($a, $b) = Array
(
    [0] => apple
    [1] => orange
    [2] => lemon
)

0

कृपया एक और अंतर पर ध्यान दें: संघ (+) खाली मूल्य के साथ गैर-रिक्त मान को अधिलेखित नहीं करेगा (एक ही कुंजी पर विचार करते हुए), जबकि array_merge होगा:

$a = array('foo' => 'bar');
$b = array('foo' => ''); // or false or 0

print_r($a+$b);
print_r(array_merge($a, $b);

आउटपुट:

Array
(
    [foo] => bar
)
Array
(
    [foo] => 0
)

0

तो जाहिर तौर पर अगर आप ऑर्डर बदलते हैं तो यूनियन और मर्ज दोनों एक ही काम करेंगे

$a = array('foo' => 'bar', 'x' => 'fromA');
$b = array('foo' => null, 'x' => 'fromB');

echo '$a+$b: ';
var_dump($a+$b);

echo '$b+$a: ';
var_dump($b+$a);

echo 'array_merge($a, $b): ';
var_dump(array_merge($a, $b));

echo 'array_merge($b, $a): ';
var_dump(array_merge($b, $a));

आउटपुट:

$a+$b: array(2) {
  ["foo"]=>
  string(3) "bar"
  ["x"]=>
  string(5) "fromA"
}
$b+$a: array(2) {
  ["foo"]=>
  NULL
  ["x"]=>
  string(5) "fromB"
}
array_merge($a, $b): array(2) {
  ["foo"]=>
  NULL
  ["x"]=>
  string(5) "fromB"
}
array_merge($b, $a): array(2) {
  ["foo"]=>
  string(3) "bar"
  ["x"]=>
  string(5) "fromA"
}

सरणियों के क्रम को ध्यान में रखें।


आपने आदेश बदल दिया: $a+$bबनाम $b+$a। कुछ भी ओवरराइड नहीं है।
ZbyszekKr

वूप्स, ops @ ZbyszekKr धन्यवाद। मुझे नहीं पता कि मैं कैसे चूक गया। फिर से आना और मेरे उत्तर को संपादित करना होगा।
निदालको डायकोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.