পিএইচপি: পুনর্নির্দেশের পরিবর্তে কীগুলি রেখে দুটি অ্যারে মার্জ করবেন?


255

স্ট্রিং / ইনটি কীগুলি রেখে আমি কীভাবে দুটি অ্যারে (একটি স্ট্রিং => মান জোড়ের সাথে অন্য এবং আন্ত => মান জোড়ের সাথে অন্য) একীভূত করতে পারি? এগুলির কোনওটিই কখনও ওভারল্যাপ করবে না (কারণ একটির কেবল স্ট্রিং রয়েছে এবং অন্যটির কেবল পূর্ণসংখ্যা রয়েছে)।

এখানে আমার বর্তমান কোডটি (যা কাজ করে না, কারণ অ্যারে_মিয়ারটি পূর্ণসংখ্যার কীগুলির সাহায্যে অ্যারেটিকে পুনরায় সূচিবদ্ধ করছে):

// get all id vars by combining the static and dynamic
$staticIdentifications = array(
 Users::userID => "USERID",
 Users::username => "USERNAME"
);
// get the dynamic vars, formatted: varID => varName
$companyVarIdentifications = CompanyVars::getIdentificationVarsFriendly($_SESSION['companyID']);
// merge the static and dynamic vars (*** BUT KEEP THE INT INDICES ***)
$idVars = array_merge($staticIdentifications, $companyVarIdentifications);

1
এটি অদ্ভুত: পিএইচপি ডক পৃষ্ঠার অনুসারে, অ্যারে_মেজার এটি করা উচিত নয় । স্ট্রিং কীগুলি কি আসলে পূর্ণসংখ্যার প্রতিনিধিত্ব করে?
ওভেনমারশাল

অ্যারে_মার্জ আমার দ্বিতীয় অ্যারের পুনর্নির্মাণ করছে। অর্থাত। তা থেকে অ্যারের পরিবর্তন করা হয় array( 123 => "VALUE123" )থেকেarray( 0 => "VALUE123" )
গ্যারেট

হুঁ, এটা আকর্ষণীয়। আমি মনে করি যে পিএইচপি ডকুমেন্টেশন সেই বিষয়টিতে কিছুটা অস্পষ্ট হতে পারে। এটি বলছে যে সমস্ত অ্যারেতে যদি সংখ্যা কী থাকে তবে কী হবে, তবে এটি না থাকলে কী হবে তা সুনির্দিষ্টভাবে বলা হয় না।
স্টিভন অক্সলে

সম্ভবত 2 বছর আগে না। তবে ২০১২ সালে, ডকুমেন্টেশনগুলি এই বিষয়টিতে ক্রিস্টাল পরিষ্কার।
কার্টবোরহর্স

আসলে, ডকুমেন্টেশন এখনও স্ফটিক পরিষ্কার নয়। "সংখ্যাসূচক" আসলে সমস্ত অঙ্ক সহ একটি স্ট্রিং অন্তর্ভুক্ত করে (পিএইচপি 5.3.3)। assert(array(0=>0,1=>1) === array_merge(array('9'=>0), array('9'=>1)))
বব স্টেইন

উত্তর:


557

আপনি কেবল অ্যারেগুলিকে 'যুক্ত' করতে পারেন:

>> $a = array(1, 2, 3);
array (
  0 => 1,
  1 => 2,
  2 => 3,
)
>> $b = array("a" => 1, "b" => 2, "c" => 3)
array (
  'a' => 1,
  'b' => 2,
  'c' => 3,
)
>> $a + $b
array (
  0 => 1,
  1 => 2,
  2 => 3,
  'a' => 1,
  'b' => 2,
  'c' => 3,
)

44
এর সাথে খুব সাবধান থাকুন! + অপারেটর একটি সংযোজন নয়, এটি একটি ইউনিয়ন। কীগুলি যদি ওভারল্যাপ না করে তবে সমস্ত কিছু ভাল, তবে তারা যদি তা করে ...
গর্ডনএম

3
কেবল বাহ - আপনি আমাকে প্রায় তিন বছর পরে কোডের লাইনের বালতিগুলি সংরক্ষণ করেছেন।
স্টিফেন ওফ্লেন

85
যদি কেউ আশ্চর্য হয় যে 'তারা যদি ওভারল্যাপ করে তবে কী হবে?' : php.net: "+ অপারেটর বাম-হাতের অ্যারেতে যুক্ত ডান হাতের অ্যারেটি দেয়; উভয় অ্যারেতে থাকা কীগুলির জন্য, বাম-হাতের অ্যারের থেকে উপাদানগুলি এবং ডান থেকে মিলিত উপাদানগুলি ব্যবহার করা হবে - এবং অ্যারে উপেক্ষা করা হবে। "
ফ্লিয়ন

2
@ ফ্লিয়ন এটির চেয়ে জটিল। '+' ব্যবহার করে, আমি একটি সাধারণ কী এবং সাবকি সহ একটি উপাদান সহ দুটি উপ-অ্যারে যুক্ত করেছি: মান যুক্ত হয়েছে! 100000 => অ্যারে (আকার = 3) 1 => ইন্ট 128 2 => ইন্ট 56 3 => ইন্ট 7 + 100000 => অ্যারে (আকার = 1) 2 => ইন্ট 30 ফলাফল: 100000 => অ্যারে (আকার = 3) 1 => ইন্ট 128 2 => ইন্ট 86 3 => ইন্ট 7 মূলত যোগ করা [2 => 56] + [2 => 30] মান প্রতিস্থাপন করে না তবে এটি যুক্ত করে এবং হয়ে যায় [2 => 86]
দারিও ফুমাগল্লি

1
@ ডারিওফুমাগল্লি আমি জানি না আমি ভুল বুঝছি কিনা বা ২০১ 2016 সাল থেকে সবেমাত্র এটি পরিবর্তন হয়েছে কিনা তবে ঠিক এই সময়ে অপারেশন print_r([2 => 56] + [2 => 30]);ফলন পেয়েছে Array ( [2] => 56 )। সুতরাং, এটি নির্দিষ্ট হিসাবে বাম হাত রাখা হয়। এই পিএইচপি 7.1.19 হিসাবে হয়, চলমান repl.it
চার্লস উড

61

আপনার যে বিবেচনা

$replaced = array('1' => 'value1', '4' => 'value4');
$replacement = array('4' => 'value2', '6' => 'value3');

করা $merge = $replacement + $replaced;আউটপুট হবে:

Array('4' => 'value2', '6' => 'value3', '1' => 'value1');

যোগফল থেকে প্রথম অ্যারের চূড়ান্ত আউটপুটে মান হবে।

করা $merge = $replaced + $replacement;আউটপুট হবে:

Array('1' => 'value1', '4' => 'value4', '6' => 'value3');

[[থাম্বসআপ]] এর উপর
ঝুরলাদ এস্ট্রেলা

21
সংক্ষেপে, 2 টি অ্যারে যুক্ত করার পরে, দ্বিতীয় থেকে প্রথম ওভাররাইড মান থেকে মানগুলি values
ডিজিমিড

1
আমি ভেবেছিলাম দ্বিতীয়টি প্রথমটিকে ওভাররাইড করবে। :)
অসীম কেটি

1
যথাযথভাবে। এজন্য আমি ব্যবহার করতে পারিনি $allValues += $newValues;
মার্থিম

করছেন $merge = $replacement + $replaced;আউটপুট:Array ( [4] => value2 [6] => value3 [1] => value1 )
চন্দন শর্মা

24

এই প্রশ্নটি বেশ পুরানো হলেও আমি কীগুলি রাখার সময় মার্জ করার আরও একটি সম্ভাবনা যুক্ত করতে চাই।

+আপনি যেটি করতে পারেন তা ব্যবহার করে বিদ্যমান অ্যারেগুলিতে কী / মান যুক্ত করার পাশাপাশি array_replace

$a = array('foo' => 'bar', 'some' => 'string');
$b = array(42 => 'answer to the life and everything', 1337 => 'leet');

$merged = array_replace($a, $b);

ফলাফলটি হবে:

Array
(
  [foo] => bar
  [some] => string
  [42] => answer to the life and everything
  [1337] => leet
)

একই কীগুলি পরের অ্যারে দ্বারা ওভাররাইট করা হবে।
এছাড়াও একটি আছে array_replace_recursive, যা subarrays জন্য এটি না।

3v4l.org এ সরাসরি উদাহরণ


3

দু'টি অ্যারে + অপারেটর দ্বারা তাদের মূল সূচকটি বাদ না দিয়ে সহজেই যুক্ত বা ইউনিয়ন করা যায় । এটি লারাভেল এবং কোডাইনিটারকে ড্রপডাউন নির্বাচন করতে খুব সাহায্য করবে।

 $empty_option = array(
         ''=>'Select Option'
          );

 $option_list = array(
          1=>'Red',
          2=>'White',
          3=>'Green',
         );

  $arr_option = $empty_option + $option_list;

আউটপুট হবে:

$arr_option = array(
   ''=>'Select Option'
   1=>'Red',
   2=>'White',
   3=>'Green',
 );

1

অ্যারে_রেপস_সেসক্রিভ বা অ্যারে_রেপ্লেস ফাংশন ব্যবহার করে দেখুন

$a = array('userID' => 1, 'username'=> 2);
array (
  userID => 1,
  username => 2
)
$b = array('userID' => 1, 'companyID' => 3);
array (
  'userID' => 1,
  'companyID' => 3
)
$c = array_replace_recursive($a,$b);
array (
  userID => 1,
  username => 2,
  companyID => 3
)

http://php.net/manual/en/function.array-replace-recursive.php

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.