পিএইচপি আরেকটি অ্যারে সংযুক্ত করে (অ্যারে_পুষ বা + নয়)


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)কমপক্ষে পিএইচপি 5+ দিয়ে আপনি যা চান ঠিক তা করা উচিত।
'15

1
(সম্পর্কিত) + পিএইচপি
গর্ডন

6
আপনার পোস্ট করা আউটপুটগুলির কোনও array_merge();আউটপুট থেকে আসে array_merge();তা আপনার যা প্রয়োজন তা print_r(array_merge($a,$b)); // outputs => Array ( [0] => a [1] => b [2] => c [3] => d )
সাদৃশ্য

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
আপনার কীগুলি কোনও সংখ্যা নয় তবে স্ট্রিং, ডক থেকে সতর্কতা অবলম্বন করুন: যদি ইনপুট অ্যারেগুলির একই স্ট্রিং কী থাকে, তবে সেই কীটির পরবর্তী মানটি পূর্ববর্তীটি ওভাররাইট করবে
দুসান প্লাভক

বা আধুনিক স্প্ল্যাট অপারেটর হিসাবে @bstoney উত্তর stackoverflow.com/a/37065301/962634 হিসাবে ব্যবহার করুন
তুলসী

76

পিএইচপি 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');

একটি সতর্কবার্তা যদিও:

  • পিএইচপি সংস্করণগুলিতে .3.৩ এর আগে এটি একটি মারাত্মক ত্রুটি ঘটায় যদি $bশূন্য অ্যারে হয় বা ট্র্যাশেবল হয় না যেমন অ্যারে নয়
  • পিএইচপি 7.3 এ $bট্র্যাভারেবল না হলে একটি সতর্কতা উত্থাপিত হবে

এই জাতীয় বাক্য গঠন জন্য কোন শব্দ ব্যবহৃত হয়? (যেমন, জেএস এটিকে স্প্রেড অপারেটর বলা হয়) বা আপনি ডক্সের লিঙ্ক সরবরাহ করতে পারেন?
তুলসী

3
@ বাসিল আপনি ...সাধারণত splat operatorপিএইচপি হিসাবে উল্লেখ করা পাবেন ।
মিকম্যাকুসা

কোনও পূর্ববর্তী উপাদানগুলিকে ওভাররাইড না করে নিজেই কোনও অ্যারে যুক্ত করার সহজ উপায় সন্ধান করার সময় সবচেয়ে দরকারী উত্তর।
ড্যানিয়েল বাটনার

1
array_pushপিএইচপি .3.৩ থেকে একক যুক্তি গ্রহণ করে যা খালি অ্যারেগুলির সাথে ত্রুটিগুলি রোধ করে।
vctls

আসলে, এটি সর্বাধিক মার্জিত এবং দক্ষ উপায়। ধন্যবাদ
হাসান আলী সালেম

33

কেন ব্যবহার করবেন না

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

আপনি কেন এটি ব্যবহার করতে চান না, সঠিক, অন্তর্নির্মিত পদ্ধতি।


ওপি কোথায় বলেছে যে সে "অ্যারে_মিটার () ব্যবহার করতে চায় না ...?
কিটেনকডিংস

3
@ কিটেনকোডিংস - প্রশ্নের "সম্পাদনা ইতিহাস" পড়ুন ... মূল প্রশ্নটি শিরোনাম ছিল PHP append one array to another (not array_merge or array_push)... পরবর্তী সময়ে PHP append one array to another (not array_merge or +)এটির বর্তমান শিরোনামে পরিবর্তনের আগে সংশোধন করা হয়েছে
মার্ক বাকের

2
@ মারকবেকার বাহ! আমি জানতাম না এসওর সম্পাদনার ইতিহাস আছে! এর জন্য দুঃখিত, এবং ধন্যবাদ, এটি অনেক কিছু পরিবর্তন করে এবং কিছুটা মাঝারিদেরকে মানুষের মুখে মুখে কথা বলতে বাধা দেয়, আমার আগে মনে হয়েছিল কিছু প্রশ্ন বিকৃত হয়েছে এবং তাদের মন্তব্যগুলি মুছে ফেলা / সম্পাদিত সামগ্রী দ্বারা বাতিল করা হয়েছে, যদিও আমি কল্পনা করেছি যে বেশিরভাগ মানুষ সম্ভবত পড়েন না সম্পাদনা ইতিহাস, আমি নিশ্চিত হেক এখন থেকে হবে
KittenCodings

21

এটি বেশ পুরানো পোস্ট, তবে আমি একটি অ্যারে অন্যটিতে যুক্ত করার বিষয়ে কিছু যুক্ত করতে চাই:

যদি

  • এক বা উভয় অ্যারেতে সহযোগী কী রয়েছে
  • উভয় অ্যারের কীগুলি কিছু যায় আসে না

আপনি এই জাতীয় অ্যারে ব্যবহার করতে পারেন:

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

অ্যারে_মার্জ সংখ্যাসূচক কীগুলি মার্জ করে না তাই এটি $ appendArray এর সমস্ত মান সংযোজন করে। ফোরচ-লুপের পরিবর্তে নেটিভ পিএইচপি ফাংশন ব্যবহার করার সময়, এটি অনেকগুলি উপাদান সহ অ্যারেতে দ্রুত হওয়া উচিত।

সংযোজন 2019-12-13: পিএইচপি 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
হ্যাঁ অ্যারে_ভ্যালুগুলি বের করার ক্ষেত্রে এটি আরও সুরক্ষিত যাতে আপনি একই কীগুলিতে মিশ্রিত না হন।
গ্যাব্রিয়েল রদ্রিগেজ

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

বড় অ্যারের জন্য মেমরির অনুলিপি এড়ানোর জন্য অ্যারে_মার্জ ছাড়াই সংযুক্ত করা ভাল।

$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

মূল: আমি পিএইচপি 7 হিসাবে বিশ্বাস করি, ফোরচ লুপগুলি এখন যেভাবে কাজ করে তার কারণে পদ্ধতি 3 একটি উল্লেখযোগ্যভাবে ভাল বিকল্প , যা অ্যারেটির একটি অনুলিপি বার বার করা হচ্ছে।

যদিও পদ্ধতি 3 প্রশ্নের 'অ্যারে_পুষ্প নয়' এর মানদণ্ডের কঠোরভাবে উত্তর নয়, এটি একটি লাইন এবং সব দিক থেকে সর্বাধিক উচ্চতর পারফরম্যান্স, আমি মনে করি ... প্রশ্নটি সিনট্যাক্সের আগে একটি বিকল্প ছিল।

আপডেট 25/03/2020: ভেরিয়েবলগুলি পুনরায় সেট না করা হওয়ায় আমি পরীক্ষাটি আপডেট করেছি wed মজার বিষয় (বা বিভ্রান্তিকরভাবে) ফলাফলগুলি এখন পরীক্ষার হিসাবে দেখায় 1 দ্রুততম, যেখানে এটি সবচেয়ে ধীর ছিল, 0.008392 থেকে 0.002717 এ চলে গেছে! এটি কেবল পিএইচপি আপডেটগুলিতে নেমে যেতে পারে, কারণ এটি পরীক্ষার ত্রুটি দ্বারা প্রভাবিত হত না।

সুতরাং, কাহিনী অবিরত রয়েছে, আমি এখন থেকে অ্যারে_মেজার ব্যবহার শুরু করব!


2
আপনি প্রতিটি পরীক্ষার আগে অ্যারে 1 পুনরায় সেট করছেন না, সুতরাং প্রতিটি পরীক্ষায় আগের তুলনায় 50,000 টি বেশি আইটেম রয়েছে।
ডাকসান

এত বছর পরেও আপনি আশ্চর্যজনক যে আপনি আমাকে এই বিষয়ে প্রথম স্থানে নিয়েছেন, আপনাকে ধন্যবাদ, আমি শীঘ্রই একটি পরীক্ষা করব :)
জেমি রবিনসন

5

পিএইচপি 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"
}

স্প্রেট অপারেটরের অ্যারে_মার্জের চেয়ে ভাল পারফরম্যান্স থাকা উচিত । এটি কেবল তাই নয় যে স্প্লট অপারেটর একটি ভাষা কাঠামো রয়েছে যখন অ্যারে_ড্যামেজ একটি ফাংশন, তবে এটিও কারণ সংকলন সময় অপ্টিমাইজেশন ধ্রুব অ্যারেগুলির জন্য পারফরম্যান্ট হতে পারে।

তদতিরিক্ত, আমরা অ্যারেতে যে কোনও জায়গায় স্প্ল্যাট অপারেটর সিনট্যাক্স ব্যবহার করতে পারি, কারণ স্প্ল্যাট অপারেটরের আগে বা পরে সাধারণ উপাদানগুলি যুক্ত করা যায়।

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

3

পিএইচপি 7 এর আগে আপনি ব্যবহার করতে পারেন:

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

array_splice()অ্যারে (1 ম আর্গুমেন্ট) এর রেফারেন্স সহ পরিচালনা করে এবং 2 য় আর্গুমেন্ট এবং 3 য় আর্গুমেন্টের সংখ্যা থেকে শুরু হওয়া মানের তালিকার স্থানে অ্যারে (4 র্থ যুক্তি) মান রাখে। যখন আমরা উত্স অ্যারের শেষ হিসাবে দ্বিতীয় তৃতীয় এবং তৃতীয় শূন্য হিসাবে সেট করি তখন আমরা 4 তম যুক্তির মান 1 ম আর্গুমেন্টে যুক্ত করি


যারা না-মুছে ফেলার স্প্লিকিং যাদু অনুসরণ করেন না তাদের কাছে আপনার কিছু ব্যাখ্যা অন্তর্ভুক্ত করা উচিত।
মিকম্যাকুসা

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

ফোরচ লুপটি বিদ্যমান অ্যারেতে মান সংযোজন করতে অ্যারে_মার্জারের চেয়ে দ্রুততর, সুতরাং আপনি যদি অন্যের শেষে একটি অ্যারে যুক্ত করতে চান তবে পরিবর্তে লুপটি চয়ন করুন।

// 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
এটি কীগুলির সাথে তুলনা করবে, যেমনটি আমি বলেছিলাম, এবং এর ফলাফলের ফলাফল: অ্যারে ([0] => এ [1] => খ)
ড্যানিল কে

1
আপনি কি নিশ্চিত যে এটি কীগুলি তুলনা করবে? ডকুমেন্টেশন বলে (জোর দিয়ে আমার): "যদি ইনপুট অ্যারেগুলিতে একই স্ট্রিং কী থাকে তবে সেই কীটির পরবর্তী মানটি পূর্বেরটি ওভাররাইট করে। মান, তবে সংযোজন করা হবে "। আপনি কি নিশ্চিত যে আপনার কীগুলি আসলে '0' => 'a'... পরিবর্তে নয় 0 => 'a'?
পিসকভোর

@ পিসকভোর কীগুলির জন্য '0' এবং 0 এর মধ্যে কোনও পার্থক্য নেই।
গর্ডন

গর্ডনের ঠিক আছে। জোর সংখ্যাতে কীগুলিতে হয় ( পূর্ণসংখ্যা কীগুলির বিপরীতে )।
নেটকোডার

1
@ গর্ডন: আহ, আপনি ঠিক বলেছেন - একসাথে দুটি জিনিস ভাবার জন্য আমি এটাই পাই। php.net/manual/en/language.operators.array.php এর জন্য ডকুমেন্টেশন রয়েছেarray + array
পিসকভোর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.