PHP में सरणी के लिए + ऑपरेटर?


192
$test = array('hi');
$test += array('test','oh');
var_dump($test);

+PHP में सरणी के लिए क्या मतलब है?


5
मुझे लगता है कि आपके सवाल का +=जवाब था और स्वीकृत जवाब था +। मेरे परीक्षण से वे ऐसा ही व्यवहार करने लगते हैं।
user151841

7
प्रलेखन बहुत अच्छी तरह से ऊपर यह योग
artfulrobot


@ रोबीएवरिल - यह वह प्रश्न है जिसे संदर्भ प्रश्न संदर्भित करता है। तो अगर कुछ भी है कि संदर्भ प्रश्न डुप्लिकेट है
icc97

2
किसी और को थोड़ा भयभीत है कि इस तरह के एक मूलभूत चीज़ के रूप में सरणी संगति के माध्यम से किया जाना है array_merge? यह ऐसा है जैसे कि ऐरे डिफॉल्ट एसोसिएटिव ऐरे हैं और न्यूमेरिक ऐरे द्वितीय श्रेणी के नागरिक हैं।
icc97

जवाबों:


271

भाषा ऑपरेटरों पर PHP मैनुअल से उद्धरण

+ ऑपरेटर बाएं हाथ के सरणी में दाहिने हाथ के सरणी को जोड़ता है; उन कुंजियों के लिए जो दोनों सरणियों में मौजूद हैं, बाएं-बाएं सरणी से तत्वों का उपयोग किया जाएगा, और दाएं-हाथ सरणी से मिलान वाले तत्वों को अनदेखा किया जाएगा।

इसलिए यदि आप

$array1 = ['one',   'two',          'foo' => 'bar'];
$array2 = ['three', 'four', 'five', 'foo' => 'baz']; 

print_r($array1 + $array2);

तुम्हे मिल जाएगा

Array
(
    [0] => one   // preserved from $array1 (left-hand array)
    [1] => two   // preserved from $array1 (left-hand array)
    [foo] => bar // preserved from $array1 (left-hand array)
    [2] => five  // added from $array2 (right-hand array)
)

तो तर्क +निम्न स्निपेट के बराबर है:

$union = $array1;

foreach ($array2 as $key => $value) {
    if (false === array_key_exists($key, $union)) {
        $union[$key] = $value;
    }
}

यदि आप सी-स्तरीय कार्यान्वयन प्रमुख के विवरण में रुचि रखते हैं


ध्यान दें, यह इस +बात से भिन्न है कि array_merge()सरणियों को कैसे संयोजित किया जाएगा:

print_r(array_merge($array1, $array2));

आपको देगा

Array
(
    [0] => one   // preserved from $array1
    [1] => two   // preserved from $array1
    [foo] => baz // overwritten from $array2
    [2] => three // appended from $array2
    [3] => four  // appended from $array2
    [4] => five  // appended from $array2
)

अधिक उदाहरणों के लिए लिंक किए गए पृष्ठ देखें।


1
@Pacerier PHP द्वारा उत्पादित php.net के पास एक औपचारिक कल्पना नहीं है, लेकिन दोनों +और हुड के तहत array_mergeकॉल zend_hash_mergeकरते हैं। यह भी अपेक्षित है, क्योंकि PHP सरणियों को आदेशित हैश मानचित्रों के रूप में कार्यान्वित किया जाता है।
बिशप

1
@Pacerier php.net ऑनलाइन डॉक्स एक विनिर्देशन का निकटतम रिकॉर्ड है, लेकिन IMO वे डॉक्स एक सच्चे कल्पना से कम हो जाते हैं: एक, वे कोड लिखे जाने के बाद अपडेट किए जाते हैं; दो, वे हर विशेष उपयोग को कवर करने के लिए नहीं लिखे गए हैं।
बिशप

14
PHP के के व्यवहार +और array_mergeविकृत और unintuitive है। वे विपरीत तरीके से गोल होते हैं कि एक सादा-अंग्रेजी पढ़ने वाला आपको सहज रूप से 'जोड़ने' या 'विलय' करने के लिए क्या कहता है। अन्य भाषाओं / पुस्तकालयों का उपयोग +सूचियों (जैसे पायथन) और "विलय" के लिए होता है, जो कि एक वस्तु पर दूसरी वस्तु से कुंजी / मान जोड़े को जोड़ने के लिए कार्य करता है (उदाहरण के लिए लताड़ में)। फिर भी PHP में यह दूसरा तरीका है; array_mergeसूची-जैसे सरणियों के लिए उपयोग किया जा सकता है, लेकिन +नहीं कर सकते। इसके विपरीत array_merge, +हमेशा वह ऑपरेशन करता है जिसे किसी अन्य भाषा में "मर्ज" कहा जाएगा।
मार्क एमी

1
@ icc97 वे वास्तव में केवल HashMaps हैं। देखें nikic.github.io/2014/12/22/...
गॉर्डन

2
मैंने यह देखने के लिए एक बग सबमिट करने की कोशिश की है कि क्या एक उपनाम array_concatबनाया जा सकता है array_merge
ic9797

18

इसका उपयोग करने के लिए मुझे जो सबसे अच्छा उदाहरण मिला, वह एक कॉन्फ़िगरेशन सरणी में है।

$user_vars = array("username"=>"John Doe");
$default_vars = array("username"=>"Unknown", "email"=>"no-reply@domain.com");

$config = $user_vars + $default_vars;

$default_vars, के रूप में यह पता चलता है, मूलभूत मूल्यों के लिए सरणी है। $user_varsसरणी मूल्यों में परिभाषित के ऊपर लिख देगा $default_vars। किसी भी लापता मान $user_varsअब से चूक संस्करण हैं $default_vars

यह इस प्रकार होगा print_r:

Array(2){
    "username" => "John Doe",
    "email" => "no-reply@domain.com"
}

आशा है कि ये आपकी मदद करेगा!


6

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

सरणी संचालकों के लिए प्रलेखन यहाँ पाया गया है


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

इसलिए, एक अच्छा अभ्यास के रूप में, मुझे लगता है, हमें खाली सरणियों के रूप में इनपुट सरणियों को आरंभ करना चाहिए। आप लोग क्या कहते हैं?
संदीपन नाथ

5

संख्यात्मक कुंजी के साथ कैरफ़ुल, यदि उन्हें संरक्षित किया जाना चाहिए या यदि आप कुछ भी ढीला नहीं करना चाहते हैं

$a = array(2 => "a2", 4 => "a4", 5 => "a5");
$b = array(1 => "b1", 3 => "b3", 4 => "b4");

संघ

print_r($a+$b);
Array
(
    [2] => a2
    [4] => a4
    [5] => a5
    [1] => b1
    [3] => b3
)

मर्ज

print_r(array_merge($a, $b));
Array
(
    [0] => a2
    [1] => a4
    [2] => a5
    [3] => b1
    [4] => b3
    [5] => b4
)

3

+ऑपरेटर के रूप में एक ही परिणाम का उत्पादन array_replace () । हालाँकि जब से ऑपरेटर के तर्क उलट हो जाते हैं, परिणामी सरणी का क्रम भी भिन्न हो सकता है।

इस पृष्ठ से एक और उदाहरण पर विस्तार:

$array1 = array('one', 'two', 'foo' => 'bar');
$array2 = array('three', 'four', 'five', 'foo' => 'baz'); 

print_r($array1 + $array2);
print_r(array_replace($array2, $array1)); //note reversed argument order

आउटपुट:

Array
(
    [0] => one   // preserved from $array1
    [1] => two   // preserved from $array1
    [foo] => bar // preserved from $array1
    [2] => five  // added from $array2
)
Array
(
    [0] => one   // preserved from $array1
    [1] => two   // preserved from $array1
    [2] => five  // added from $array2
    [foo] => bar // preserved from $array1
)

+ऐनक द्वारा गारंटी का आदेश है ? किस बारे में array_replace?
पचेरियर

1
  1. ऐरे प्लस ऑपरेशन सभी ऐरे को एशोक एरे मानता है।
  2. जब प्लस के दौरान कुंजी संघर्ष, बाएं (पिछले) मान रखा जाएगा

मैं चीजों को स्पष्ट करने के लिए नीचे दिए गए कोड को पोस्ट करता हूं।

$a + $b = array_plus($a, $b)

function array_plus($a, $b){
    $results = array();
    foreach($a as $k=>$v) if(!isset($results[$k]))$results[$k] = $v;
    foreach($b as $k=>$v) if(!isset($results[$k]))$results[$k] = $v;
    return $results;
}

@ टैमलिन का कोड रन साबित करता है कि आपका दावा "एरे प्लस प्लस ऑपरेशन सभी एरे को एशोक एरे मानता है" गलत है।
पचेरियर

@ स्पेसर कि कुंजी पूर्णांक भी हो सकता है।
हितेश


-4
$var1 = "example";
$var2 = "test";
$output = array_merge((array)$var1,(array)$var2);
print_r($output);

ऐरे ([0] => उदाहरण [1] => परीक्षण)


1
इस सूत्र में उल्लेख किया गया है कि कैसे array_merge () बधाई नहीं है।
डबलजॉश

@doublejosh, "congruent"? मतलब?
पचेरियर

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