PHP एक सरणी को दूसरे से जोड़ती है (array_push या + नहीं)


278

उनकी कुंजियों की तुलना किए बिना एक सरणी को दूसरे में कैसे जोड़ा जाए?

$a = array( 'a', 'b' );
$b = array( 'c', 'd' );

अंत में यह होना चाहिए: Array( [0]=>a [1]=>b [2]=>c [3]=>d ) अगर मैं कुछ का उपयोग करता हूं []या array_push, यह इन परिणामों में से एक का कारण होगा:

Array( [0]=>a [1]=>b [2]=>Array( [0]=>c [1]=>d ) )
//or
Array( [0]=>c [1]=>d )

यह सिर्फ कुछ होना चाहिए, ऐसा कर रहा है, लेकिन अधिक सुरुचिपूर्ण तरीके से:

foreach ( $b AS $var )
    $a[] = $var;

16
array_merge ($a, $b)कम से कम PHP 5+ के साथ आप जो चाहते हैं, वही करें।
24१०


6
आउटपुट से कोई भी आप से आते हैं तैनात array_merge();उत्पादन का array_merge();exaclty होना चाहिए कि तुम क्या जरूरत है:print_r(array_merge($a,$b)); // outputs => Array ( [0] => a [1] => b [2] => c [3] => d )
ACM

2
मैं "परिशिष्ट" शब्द से पूरी तरह असहमत हूं। परिशिष्ट का वास्तव में अर्थ है कि एक सरणी के आइटम दूसरे (गंतव्य) सरणी के तत्व बन जाते हैं, जिसमें पहले से ही कुछ तत्व हो सकते हैं, इसलिए गंतव्य सरणी को बदल सकते हैं। मर्ज दोनों सरणियों का एक नया सरणी और COPIES तत्व आवंटित करता है, जबकि अतिरिक्त रूप से इसका मतलब है अतिरिक्त मेमोरी आवंटन के बिना गंतव्य सरणी तत्वों का पुन: उपयोग करना।
तिष्मा

जवाबों:


424

array_merge सुरुचिपूर्ण तरीका है:

$a = array('a', 'b');
$b = array('c', 'd');
$merge = array_merge($a, $b); 
// $merge is now equals to array('a','b','c','d');

कुछ ऐसा करना:

$merge = $a + $b;
// $merge now equals array('a','b')

काम नहीं करेगा, क्योंकि +ऑपरेटर वास्तव में उनका विलय नहीं करता है। अगर उनके $aपास उतनी ही कुंजी है $b, तो यह कुछ भी नहीं करेगा।


16
बस सावधान रहें यदि आपकी चाबियाँ एक संख्या नहीं हैं, लेकिन तार हैं, डॉक्टर से: यदि इनपुट सरणियों में समान स्ट्रिंग कुंजियाँ हैं, तो उस कुंजी के लिए बाद का मान पिछले एक को अधिलेखित कर देगा
Dusan Plavak

या आधुनिक का उपयोग सूचक @bstoney जवाब के रूप में ऑपरेटर stackoverflow.com/a/37065301/962634
तुलसी

76

PHP 5.6+ में ऐसा करने का एक और तरीका ...टोकन का उपयोग करना होगा

$a = array('a', 'b');
$b = array('c', 'd');

array_push($a, ...$b);

// $a is now equals to array('a','b','c','d');

यह भी किसी के साथ काम करेगा Traversable

$a = array('a', 'b');
$b = new ArrayIterator(array('c', 'd'));

array_push($a, ...$b);

// $a is now equals to array('a','b','c','d');

एक चेतावनी हालांकि:

  • PHP संस्करणों में 7.3 से पहले यह एक घातक त्रुटि का कारण होगा यदि $bखाली सरणी है या नहीं जैसे कि कोई सरणी नहीं है
  • PHP 7.3 में यदि $bट्रैवर्सेबल नहीं है तो चेतावनी दी जाएगी

ऐसे वाक्यविन्यास के लिए किस शब्द का प्रयोग किया जाता है? (उदा। JS में इसे प्रसार ऑपरेटर कहा जाता है) या आप डॉक्स का लिंक प्रदान कर सकते हैं?
तुलसी

3
@basil आपको ...आमतौर पर splat operatorphp के रूप में जाना जाएगा ।
मिकमैकुसा

किसी भी पिछले तत्वों को ओवरराइड किए बिना अपने आप को एक सरणी संलग्न करने के लिए एक सरल तरीके की तलाश में सबसे उपयोगी जवाब।
डैनियल बॉटलर

1
array_pushphp 7.3 के बाद से एकल तर्क को स्वीकार करता है, जो खाली सरणियों के साथ त्रुटियों को रोकता है।
vctls

वास्तव में, यह सबसे सुंदर और कुशल तरीका है। धन्यवाद
हसन अली सलेम

33

क्यों नहीं इस्तेमाल करते?

$appended = array_merge($a,$b); 

आप इसका उपयोग क्यों नहीं करना चाहते हैं, सही, अंतर्निहित विधि।


ओपी कहाँ कहता है कि वह "array_merge () का उपयोग नहीं करना चाहता ...?
बिल्ली का बच्चा का बच्चा

3
@KittenCodings - प्रश्न का "इतिहास संपादित करें" पढ़ें ... मूल प्रश्न का हकदार था PHP append one array to another (not array_merge or array_push)... बाद में PHP append one array to another (not array_merge or +)अपने वर्तमान शीर्षक में बदलने से पहले संशोधित किया गया
मार्क बेकर

2
@MarkBaker वाह! मुझे नहीं पता था कि SO का एक संपादित इतिहास है! इसके बारे में क्षमा करें, और धन्यवाद, यह बहुत कुछ बदलता है और कुछ हद तक मध्यस्थों को लोगों के मुंह में शब्द डालने से रोकता है, मुझे पहले लगा था कि कुछ प्रश्न हटा दिए गए थे और उनकी टिप्पणियों को हटाए गए / संपादित किए गए सामग्री द्वारा अमान्य कर दिया गया था, हालांकि मुझे लगता है कि ज्यादातर लोग शायद नहीं पढ़ते हैं संपादित इतिहास, मुझे यकीन है कि बिल्ली के रूप में अब से होगा
KittenCodings

21

यह बहुत पुरानी पोस्ट है, लेकिन मैं एक सरणी को दूसरे में जोड़ने के बारे में कुछ जोड़ना चाहता हूं:

अगर

  • एक या दोनों सरणियों में साहचर्य कुंजी है
  • दोनों सरणियों की कुंजियाँ मायने नहीं रखती हैं

आप इस तरह सरणी कार्यों का उपयोग कर सकते हैं:

array_merge(array_values($array), array_values($appendArray));

array_merge संख्यात्मक कुंजियों को मर्ज नहीं करता है, इसलिए यह $ appendArray के सभी मूल्यों को जोड़ता है। फॉर्च-लूप के बजाय देशी php फ़ंक्शन का उपयोग करते समय, यह बहुत सारे तत्वों के साथ सरणियों पर तेज होना चाहिए।

परिवर्धन 2019-12-13: PHP 7.4 के बाद से, ऐरे स्प्रेडडेक्टर को एपेंड करने या प्रीपेन्ड करने की संभावना है:

    $a = [3, 4];
    $b = [1, 2, ...$a];

पहले की तरह, कुंजी इस नई सुविधा के साथ एक समस्या हो सकती है:

    $a = ['a' => 3, 'b' => 4];
    $b = ['c' => 1, 'a' => 2, ...$a];

"घातक त्रुटि: अनकवर्ड एरर: स्ट्रिंग कुंजियों के साथ अनपैक ऐरे को नहीं कर सकता"

    $a = [3 => 3, 4 => 4];
    $b = [1 => 1, 4 => 2, ...$a];

सरणी (4) {[1] => इंट (1) [4] => इंट (2) [5] => इंट (3) [6] => इंट (4)}

    $a = [1 => 1, 2 => 2];
    $b = [...$a, 3 => 3, 1 => 4];

सरणी (3) {[0] => इंट (1) [1] => इंट (4) [3] => इंट (3)}


1
यह भी इनपुट सरणियों को अछूता छोड़ने का लाभ होना चाहिए।
जॉन सुरेल

1
हां यह सिर्फ array_values ​​निकालने के मामले में अधिक सुरक्षित है ताकि आप एक ही कुंजी में मर्ज न करें।
गेब्रियल रोड्रिगेज

15
<?php
// Example 1 [Merging associative arrays. When two or more arrays have same key
// then the last array key value overrides the others one]

$array1 = array("a" => "JAVA", "b" => "ASP");
$array2 = array("c" => "C", "b" => "PHP");
echo " <br> Example 1 Output: <br>";
print_r(array_merge($array1,$array2));

// Example 2 [When you want to merge arrays having integer keys and
//want to reset integer keys to start from 0 then use array_merge() function]

$array3 =array(5 => "CSS",6 => "CSS3");
$array4 =array(8 => "JAVASCRIPT",9 => "HTML");
echo " <br> Example 2 Output: <br>";
print_r(array_merge($array3,$array4));

// Example 3 [When you want to merge arrays having integer keys and
// want to retain integer keys as it is then use PLUS (+) operator to merge arrays]

$array5 =array(5 => "CSS",6 => "CSS3");
$array6 =array(8 => "JAVASCRIPT",9 => "HTML");
echo " <br> Example 3 Output: <br>";
print_r($array5+$array6);

// Example 4 [When single array pass to array_merge having integer keys
// then the array return by array_merge have integer keys starting from 0]

$array7 =array(3 => "CSS",4 => "CSS3");
echo " <br> Example 4 Output: <br>";
print_r(array_merge($array7));
?>

आउटपुट:

Example 1 Output:
Array
(
[a] => JAVA
[b] => PHP
[c] => C
)

Example 2 Output:
Array
(
[0] => CSS
[1] => CSS3
[2] => JAVASCRIPT
[3] => HTML
)

Example 3 Output:
Array
(
[5] => CSS
[6] => CSS3
[8] => JAVASCRIPT
[9] => HTML
)

Example 4 Output:
Array
(
[0] => CSS
[1] => CSS3
)

संदर्भ स्रोत कोड


12

बड़ी सरणी के लिए, array_merge के बिना संक्षिप्त करना बेहतर है, मेमोरी कॉपी से बचने के लिए।

$array1 = array_fill(0,50000,'aa');
$array2 = array_fill(0,100,'bb');

// Test 1 (array_merge)
$start = microtime(true);
$r1 = array_merge($array1, $array2);
echo sprintf("Test 1: %.06f\n", microtime(true) - $start);

// Test2 (avoid copy)
$start = microtime(true);
foreach ($array2 as $v) {
    $array1[] = $v;
}
echo sprintf("Test 2: %.06f\n", microtime(true) - $start);


// Test 1: 0.004963
// Test 2: 0.000038

एक आकर्षण की तरह काम करता है, मेरे लिए यह दृष्टिकोण 50x तेज था।
लुटकेन्स

9

Bstoney और Snark द्वारा उत्तर देने के बाद मैंने विभिन्न तरीकों पर कुछ परीक्षण किए:

// Test 1 (array_merge)
$array1 = $array2 = array_fill(0, 50000, 'aa');
$start = microtime(true);
$array1 = array_merge($array1, $array2);
echo sprintf("Test 1: %.06f\n", microtime(true) - $start);

// Test2 (foreach)
$array1 = $array2 = array_fill(0, 50000, 'aa');
$start = microtime(true);
foreach ($array2 as $v) {
    $array1[] = $v;
}
echo sprintf("Test 2: %.06f\n", microtime(true) - $start);

// Test 3 (... token)
// PHP 5.6+ and produces error if $array2 is empty
$array1 = $array2 = array_fill(0, 50000, 'aa');
$start = microtime(true);
array_push($array1, ...$array2);
echo sprintf("Test 3: %.06f\n", microtime(true) - $start);

जो उत्पादन करता है:

Test 1: 0.002717 
Test 2: 0.006922 
Test 3: 0.004744

मूल: मेरा मानना ​​है कि PHP 7 के रूप में, विधि 3 अब जिस तरह से फॉर्चेट लूप का कार्य करती है , उसके कारण एक बेहतर विकल्प है , जो कि सरणी की एक प्रतिलिपि बनाने के लिए है।

जबकि विधि 3 कड़ाई से प्रश्न में 'नहीं array_push' के मानदंड का जवाब है, यह एक पंक्ति है और सभी मामलों में सबसे उच्च प्रदर्शन है, मुझे लगता है कि प्रश्न से पहले पूछा गया था ... वाक्यविन्यास एक विकल्प था।

अद्यतन 25/03/2020: मैंने परीक्षण को अद्यतन किया है जो चर के रूप में त्रुटिपूर्ण था। दिलचस्प है (या भ्रामक) परिणाम अब परीक्षण 1 के रूप में दिखाते हैं कि यह सबसे तेज़ है, जहां यह सबसे धीमा था, 0.008392 से 0.002717 तक चला गया! यह केवल PHP अपडेट के लिए नीचे हो सकता है, क्योंकि यह परीक्षण दोष से प्रभावित नहीं होगा।

इसलिए, गाथा जारी है, मैं अभी से array_merge का उपयोग करना शुरू कर दूंगा!


2
आप प्रत्येक परीक्षण से पहले array1 रीसेट नहीं कर रहे हैं, इसलिए प्रत्येक परीक्षण में पिछले की तुलना में 50,000 अधिक आइटम हैं।
Dakusan

इतने सालों के बाद कमाल आप इस पर मुझे लेने वाले पहले व्यक्ति हैं, धन्यवाद, मैं जल्द ही एक पुन: प्रयास करूंगा :)
जेमी रॉबिन्सन

5

PHP 7.4 के बाद से आप ... ऑपरेटर का उपयोग कर सकते हैं । इसे रूबी सहित अन्य भाषाओं में स्पैट ऑपरेटर के रूप में भी जाना जाता है ।

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

उत्पादन

array(5) {
    [0]=>
    string(6) "banana"
    [1]=>
    string(6) "orange"
    [2]=>
    string(5) "apple"
    [3]=>
    string(4) "pear"
    [4]=>
    string(10) "watermelon"
}

Splat ऑपरेटर array_merge से बेहतर प्रदर्शन करना चाहिए । ऐसा इसलिए नहीं है क्योंकि splat ऑपरेटर एक भाषा संरचना है जबकि array_merge एक फ़ंक्शन है, लेकिन यह भी क्योंकि संकलन समय निरंतर अनुकूलन के लिए अनुकूल हो सकता है।

इसके अलावा, हम ऐरे में हर जगह स्पैट ऑपरेटर सिंटैक्स का उपयोग कर सकते हैं, क्योंकि सामान्य तत्वों को स्पैट ऑपरेटर से पहले या बाद में जोड़ा जा सकता है।

$arr1 = [1, 2, 3];
$arr2 = [4, 5, 6];
$arr3 = [...$arr1, ...$arr2];
$arr4 = [...$arr1, ...$arr3, 7, 8, 9];

3

PHP7 से पहले आप उपयोग कर सकते हैं:

array_splice($a, count($a), 0, $b);

array_splice()सरणी (1 तर्क) के संदर्भ में संचालित होता है और 2 तर्क और 3 तर्क की संख्या से शुरू होने वाले मूल्यों की सूची के स्थान पर सरणी (4 वाँ तर्क) मान डालता है। जब हम 2 तर्क को स्रोत सरणी के अंत में और 3 को शून्य के रूप में सेट करते हैं, तो हम 1 तर्क में 4 वें मान को जोड़ते हैं


आपको उन लोगों के लिए कुछ स्पष्टीकरण शामिल करना चाहिए जो गैर-हटाने वाले जादू के जादू का पालन नहीं करते हैं।
मिकमैकुसा

0

यदि आप मौजूदा नए मान के साथ खाली सरणी को मर्ज करना चाहते हैं। आपको इसे पहले शुरू करना होगा।

$products = array();
//just example
for($brand_id=1;$brand_id<=3;$brand_id++){
  array_merge($products,getByBrand($brand_id));
}
// it will create empty array
print_r($a);

//check if array of products is empty
for($brand_id=1;$brand_id<=3;$brand_id++){
  if(empty($products)){
    $products = getByBrand($brand_id);
  }else{
    array_merge($products,getByBrand($brand_id));
  }
}
// it will create array of products

आशा है कि इसकी मदद मिलेगी।


0

एक मौजूदा सरणी में मानों को जोड़ने के लिए foreach लूप array_merge से अधिक तेज़ है, इसलिए यदि आप किसी अन्य के अंत में एक सरणी जोड़ना चाहते हैं, तो लूप चुनें।

// Create an array of arrays
$chars = [];
for ($i = 0; $i < 15000; $i++) {
    $chars[] = array_fill(0, 10, 'a');
}

// test array_merge
$new = [];
$start = microtime(TRUE);
foreach ($chars as $splitArray) {
    $new = array_merge($new, $splitArray);
}
echo microtime(true) - $start; // => 14.61776 sec

// test foreach
$new = [];
$start = microtime(TRUE);
foreach ($chars as $splitArray) {
    foreach ($splitArray as $value) {
        $new[] = $value;
    }
}
echo microtime(true) - $start; // => 0.00900101 sec
// ==> 1600 times faster

यह उत्तर पृष्ठ पर कोई नई जानकारी नहीं लाता है। प्रदर्शन की तुलना वर्षों पहले की गई थी।
मिकमैकुसा

-4

इस बारे में कैसा है:

$appended = $a + $b;

1
यह कुंजियों की तुलना करेगा, जैसा कि मैंने कहा, और निम्नलिखित के साथ परिणाम: Array ([0] => a [1] => b)
Danil K

1
क्या आप सुनिश्चित हैं कि यह कुंजियों की तुलना करेगा? प्रलेखन (जोर मेरा) कहते हैं: "यदि इनपुट सरणियों में समान स्ट्रिंग कुंजियाँ हैं, तो उस कुंजी के लिए बाद का मान पिछले वाले को अधिलेखित कर देगा। यदि, हालांकि, सरणियों में संख्यात्मक कुंजियाँ हैं, तो बाद का मान मूल को अधिलेखित नहीं करेगा। मूल्य, लेकिन संलग्न किया जाएगा। " क्या आपको यकीन है कि आपकी चाबियाँ वास्तव में नहीं हैं '0' => 'a'... इसके बजाय 0 => 'a'?
पिस्कवर ने

@ कुंजी में '0' और 'की' के लिए कोई अंतर नहीं है।
गॉर्डन

गॉर्डन का अधिकार। जोर संख्यात्मक कुंजियों पर है ( पूर्णांक कुंजियों के विपरीत )।
netcoder

1
@ गोर्डन: आह, आप सही कह रहे हैं - यही मुझे दो चीजों के बारे में सोचने के लिए मिलता है। php.net/manual/en/language.operators.array.php के लिए दस्तावेज़ीकरण हैarray + array
पिस्कॉर ने बिल्डिंग को छोड़ दिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.