दो सरणियों को मिलाएं


88

मेरे पास दो सरणियाँ हैं:

array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44'
);

array( 
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);

मैं इन दोनों सरणी को संयोजित करना चाहता हूं ताकि इसमें डुप्लिकेट शामिल न हो और साथ ही साथ अपनी मूल कुंजी रखें। उदाहरण के लिए आउटपुट होना चाहिए:

array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);

मैंने यह कोशिश की है लेकिन यह उनकी मूल कुंजी बदल रहा है:

$output = array_unique( array_merge( $array1 , $array2 ) );

कोई भी समाधान?

जवाबों:


161

महज प्रयोग करें:

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

इसे हल करना चाहिए। क्योंकि आप स्ट्रिंग कुंजियों का उपयोग करते हैं यदि एक कुंजी एक बार (जैसे '44'आपके उदाहरण में) होती है, तो एक कुंजी एक ही नाम के साथ प्रोसेसिंग को अधिलेखित कर देगी। क्योंकि आपके मामले में उन दोनों का मूल्य समान है, वैसे भी इससे कोई फर्क नहीं पड़ता है और यह डुप्लिकेट को भी हटा देगा।

अद्यतन: मुझे बस एहसास हुआ, कि PHP संख्यात्मक स्ट्रिंग-कुंजी को संख्याओं (पूर्णांक) के रूप में मानता है और इसलिए इस तरह से व्यवहार करेगा, इसका क्या मतलब है, कि यह कुंजियों को भी त्याग देता है ...

कुंजी को फिर से बनाने के लिए वर्कअराउंड किया जाता है।

$output = array_combine($output, $output);

अपडेट 2: मैं हमेशा भूल जाता हूं, कि एक ऑपरेटर भी है (बोल्ड में, क्योंकि यह वास्तव में वही है जो आप ढूंढ रहे हैं !: D

$output = $array1 + $array2;

यह सब इसमें देखा जा सकता है: http://php.net/manual/en/function.array-merge.php


5
@KingCrunch - भले ही संख्या उद्धृत की जाती है, लेकिन वे स्ट्रिंग कुंजी नहीं हैं और इसलिए सूचकांक संरक्षित नहीं किया जाएगा। उदाहरण: ideone.com/I2NFT
ब्रेंडन

1
वास्तव में ... पहले मैं "बग" के बारे में बात करना चाहता था, लेकिन फिर मैंने देखा, कि मैनुअल केवल "संख्यात्मक कुंजी" के बारे में बात करता है, न कि "पूर्णांक कुंजी"। थोडा भ्रम सा लगता है।
किंगक्रंच

+1 मैं ऑपरेटर के बारे में भूल गया! बहुत बढ़िया (उस हिस्से को बोल्ड (;) में रखें)
ब्रेंडन बुल्लेन

3
तो संयोजन के $array1 + $array2बजाय छोटा और कुशल समाधान हैarray_merge() - array_combine()
Awan

2
चेतावनी! गैर-एशोक सरणियों के लिए या यदि सरणियों में सामान्य कुंजियां हैं$a + $b != array_merge($a, $b)
jmarceli

33

आपको इस पर विचार करना चाहिए $array1 + $array2 != $array2 + $array1

$array1 = array(
'11' => 'x1',
'22' => 'x1' 
);  

$array2 = array(
'22' => 'x2',
'33' => 'x2' 
);

साथ $ array1 + $ array2

$array1 + $array2 = array(
'11' => 'x1',
'22' => 'x1',
'33' => 'x2'
);

और $ array2 + $ array1 के साथ

$array2 + $array1 = array(  
'11' => 'x1',  
'22' => 'x2',  
'33' => 'x2'  
);

25

यह काम:

$output = $array1 + $array2;

12
मैं इसकी सिफारिश नहीं करूंगा क्योंकि यह व्यवहार बहुत ही अनुचित है, जैसे[1,2,3] + [4,5,6] == [1,2,3]
jchook

@jchook तुम फिर क्या सलाह देते हो?
माइकास

मुझे यही चाहिए, धन्यवाद। यहाँ क्यों: http_build_query(array_merge($array1, $array2))मेरे लिए काम नहीं किया, जबकि http_build_query($array1 + $array2)किया।
बैरीमोड

4

ऐसा करने के लिए, आप एक के माध्यम से लूप कर सकते हैं और दूसरे को जोड़ सकते हैं:

<?php

$test1 = array( 
'11' => '11',
'22' => '22',
'33' => '33',
'44' => '44'
);

$test2 = array( 
'44' => '44',
'55' => '55',
'66' => '66',
'77' => '77'
);


function combineWithKeys($array1, $array2)
{
    foreach($array1 as $key=>$value) $array2[$key] = $value;
    asort($array2);
    return $array2;
} 

print_r(combineWithKeys($test1, $test2));

?>

अद्यतन: KingCrunch सबसे अच्छा समाधान के साथ आया :print_r($array1+$array2);


2

यदि आप PHP 7.4 या इसके बाद के संस्करण का उपयोग कर रहे हैं, तो आप ...PHP डॉक्स से निम्न उदाहरण के रूप में प्रसार ऑपरेटर का उपयोग कर सकते हैं :

$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]

function getArr() {
  return ['a', 'b'];
}
$arr6 = [...getArr(), 'c']; //['a', 'b', 'c']

$arr7 = [...new ArrayIterator(['a', 'b', 'c'])]; //['a', 'b', 'c']

function arrGen() {
    for($i = 11; $i < 15; $i++) {
        yield $i;
    }
}
$arr8 = [...arrGen()]; //[11, 12, 13, 14]

यह जावास्क्रिप्ट ES6 की तरह काम करता है।

Https://wiki.php.net/rfc/spread_operator_for_array पर अधिक देखें ।


यह प्रश्न पर लागू नहीं है। OP के पास सरणी संचालक के लिए स्ट्रिंग कुंजियाँ हैं (वह फैल ऑपरेटर के साथ काम नहीं करता है) और OP कुंजियाँ सुरक्षित रखना चाहता है (प्रसार ऑपरेटर कुंजी दूर फेंकता है)। इसके अलावा OP डुप्लिकेट नहीं चाहता है।
मार्टी

ओह मैं आपकी बातों को देखता हूं। यह सच है, और आप सही हैं। क्या आप अन्य लोगों के लिए मेरे उत्तर को बेहतर बनाने में मदद करने के लिए कुछ कोड प्रदान कर सकते हैं? मैं आपके समय की सराहना करता हूँ! मेरे उत्तर की कमियों को इंगित करने के लिए आपका बहुत-बहुत धन्यवाद।
साइंस के छात्र

मुझे नहीं लगता कि प्रसार ऑपरेटर यहां जाने का रास्ता है। इसके बजाय दिए गए उत्तर का उपयोग करें$array1 + $array2
मार्टी

मुझे इसकी जानकारी नहीं थी! मेरा मतलब है, मुझे नहीं पता था कि हम कर सकते हैं $ouput = $array1 + $array2। अब मैंने कुछ नया सीखा है! धन्यवाद!
विज्ञान के छात्र

1

यह काम:

$a = array(1 => 1, 2 => 2, 3 => 3);
$b = array(4 => 4, 5 => 5, 6 => 6);
$c = $a + $b;
print_r($c);

1

चेतावनी! $ array1 + $ array2 चाबियाँ अधिलेखित करता है, इसलिए मेरा समाधान (बहुआयामी सरणियों के लिए) array_ique () का उपयोग करना है

array_unique(array_merge($a, $b), SORT_REGULAR);

नोटिस:

5.2.10+ SORT_STRING को sort_flagsवापस डिफ़ॉल्ट मान को परिवर्तित किया ।

5.2.9 डिफ़ॉल्ट SORT_REGULAR है।

5.2.8- डिफ़ॉल्ट SORT_STRING है

यह पूरी तरह से काम करता है । आशा है कि यह वही मदद करता है।


1
array_merge()हालांकि कुंजी को संरक्षित नहीं करता है। इसके द्वारा बनाई गई सरणी 0 अनुक्रमित है।
HPierce

@ अच्छी तरह से, बहुआयामी सरणी जोड़ मामले में, कुछ जानकारी का उपयोग कर खो जाएगा +। एक नज़र डालें: PHPFiddle , $ b [0] खो जाएगा ...
नॉर्मन एडवांस

1

Php7.4 के साथ इसे करने का नया तरीका स्प्रेड ऑपरेटर है [...]

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
var_dump($fruits);

स्प्रेड ऑपरेटर की तुलना में बेहतर प्रदर्शन होना चाहिए array_merge

स्प्रेड ऑपरेटर का एक महत्वपूर्ण लाभ यह है कि यह किसी भी ट्रैवर्सेबल ऑब्जेक्ट का समर्थन करता है, जबकि array_merge फ़ंक्शन केवल सरणियों का समर्थन करता है।


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