এখানে আমার খুব সাধারণ, পিএইচপি 5.5- সামঞ্জস্যপূর্ণ সমাধান:
function array_map_assoc(callable $f, array $a) {
return array_column(array_map($f, array_keys($a), $a), 1, 0);
}
Callable আপনাকে সরবরাহ নিজেই অর্থাত দুটি মানের সঙ্গে একটি অ্যারের আসতে উচিত, return [key, value]
। অভ্যন্তরীণ কলটি array_map
তাই অ্যারে তৈরি করে। এটি এর পরে একক মাত্রা অ্যারেতে রূপান্তরিত হয় array_column
।
ব্যবহার
$ordinals = [
'first' => '1st',
'second' => '2nd',
'third' => '3rd',
];
$func = function ($k, $v) {
return ['new ' . $k, 'new ' . $v];
};
var_dump(array_map_assoc($func, $ordinals));
আউটপুট
array(3) {
["new first"]=>
string(7) "new 1st"
["new second"]=>
string(7) "new 2nd"
["new third"]=>
string(7) "new 3rd"
}
আংশিক প্রয়োগ
আপনি যদি বিভিন্ন অ্যারে দিয়ে একই ম্যাপিং ফাংশনটি দিয়ে অনেক বার ফাংশনটি ব্যবহার করতে চান তবে আপনি আংশিক ফাংশন অ্যাপ্লিকেশন (' কারিঙের সাথে সম্পর্কিত ') নামে কিছু করতে পারেন , যা আপনাকে কেবলমাত্র ডাকে যাওয়ার পরে ডেটা অ্যারেতে যেতে দেয়:
function array_map_assoc_partial(callable $f) {
return function (array $a) use ($f) {
return array_column(array_map($f, array_keys($a), $a), 1, 0);
};
}
...
$my_mapping = array_map_assoc_partial($func);
var_dump($my_mapping($ordinals));
যা একই আউটপুট উত্পাদন করে, প্রদত্ত $func
এবং$ordinals
পূর্বের মতো।
দ্রষ্টব্য: আপনার ম্যাপযুক্ত ফাংশনটি যদি দুটি আলাদা ইনপুটগুলির জন্য একই কীটি দেয় তবে পরবর্তী কীটির সাথে যুক্ত মানটি জিতবে। array_map_assoc
পূর্ববর্তী কীগুলি বিজয়ী করার জন্য ইনপুট অ্যারে এবং আউটপুট ফলাফলের বিপরীত করুন । (আমার উদাহরণে ফিরে আসা কীগুলি সংঘর্ষে আসতে পারে না কারণ তারা উত্স অ্যারের কীটি অন্তর্ভুক্ত করে, যা পরিবর্তিতভাবে অনন্য হতে হবে))
বিকল্প
নিম্নলিখিতটি উপরে বর্ণিত একটি বৈকল্পিক যা কিছুটির পক্ষে আরও যুক্তিযুক্ত প্রমাণিত হতে পারে তবে পিএইচপি 5.6 প্রয়োজন:
function array_map_assoc(callable $f, array $a) {
return array_merge(...array_map($f, array_keys($a), $a));
}
এই বৈকল্পিক ক্ষেত্রে, আপনার সরবরাহিত ফাংশন (যার উপরে ডেটা অ্যারে ম্যাপ করা থাকে) এর পরিবর্তে এক সারি সহ কোনও এসোসিয়েটিভ অ্যারে ফিরিয়ে দেওয়া উচিত, অর্থাৎ return [key => value]
। কলযোগ্যকে ম্যাপিংয়ের ফলাফলটি কেবল খালি প্যাক করে পাস করা হয় array_merge
। আগের হিসাবে, একটি সদৃশ কীটি ফেরত দেওয়ার ফলে পরবর্তী মানগুলি জয়ী হবে।
এনবি অ্যালেক্স 6836৯০ একটি মন্তব্যে উল্লেখ করেছে যে array_replace
এখানে স্টেমে ব্যবহার array_merge
করলে পূর্ণসংখ্যা কীগুলি সংরক্ষণ করা যায়। array_replace
ইনপুট অ্যারে সংশোধন করে না, তাই কার্যকরী কোডের জন্য নিরাপদ।
আপনি পিএইচপি 5.3 থেকে 5.5 এ থাকলে নিম্নলিখিতটি সমতুল্য। এটি ব্যবহার করে array_reduce
এবং বাইনারি +
অ্যারে অপারেটর সংরক্ষণের কীগুলি সহ ফলস্বরূপ দ্বি-মাত্রিক অ্যারেটিকে এক-মাত্রিক অ্যারেতে রূপান্তর করতে:
function array_map_assoc(callable $f, array $a) {
return array_reduce(array_map($f, array_keys($a), $a), function (array $acc, array $a) {
return $acc + $a;
}, []);
}
ব্যবহার
এই দুটি রূপই এইভাবে ব্যবহৃত হত:
$ordinals = [
'first' => '1st',
'second' => '2nd',
'third' => '3rd',
];
$func = function ($k, $v) {
return ['new ' . $k => 'new ' . $v];
};
var_dump(array_map_assoc($func, $ordinals));
উল্লেখ্য =>
পরিবর্তে ,
মধ্যে$func
।
আউটপুট আগের মতো একই, এবং প্রতিটি আংশিকভাবে আগের মতো একইভাবে প্রয়োগ করা যেতে পারে।
সারসংক্ষেপ
মূল প্রশ্নের লক্ষ্য হ'ল কলটির অনুরোধটিকে যতটা সম্ভব সহজ করা, আরও জটিল ক্রিয়াকলাপটি চালিত হওয়া ব্যয় করে যেটি ডাকে; বিশেষত, কী এবং মানগুলিকে বিভক্ত না করে একক যুক্তি হিসাবে ডেটা অ্যারে পাস করার ক্ষমতা থাকতে হবে। এই উত্তরের শুরুতে সরবরাহ করা ফাংশনটি ব্যবহার করে:
$test_array = ["first_key" => "first_value",
"second_key" => "second_value"];
$array_map_assoc = function (callable $f, array $a) {
return array_column(array_map($f, array_keys($a), $a), 1, 0);
};
$f = function ($key, $value) {
return [$key, $key . ' loves ' . $value];
};
var_dump(array_values($array_map_assoc($f, $test_array)));
অথবা, শুধুমাত্র এই প্রশ্নের জন্য, array_map_assoc()
আউটপুট কীগুলি ড্রপ করে ফাংশনটির জন্য আমরা একটি সরলীকরণ করতে পারি , যেহেতু প্রশ্ন তাদের জিজ্ঞাসা করে না:
$test_array = ["first_key" => "first_value",
"second_key" => "second_value"];
$array_map_assoc = function (callable $f, array $a) {
return array_map($f, array_keys($a), $a);
};
$f = function ($key, $value) {
return $key . ' loves ' . $value;
};
var_dump($array_map_assoc($f, $test_array));
তাই উত্তর কোন , আপনাকে কল এড়াতে পারে না array_keys
, কিন্তু আপনি জায়গা যেখানে আউট বিমূর্ত করতে পারেন array_keys
, একটি উচ্চ-অর্ডার ফাংশন মধ্যে নামক পরার ভাল যথেষ্ট হবে হতে পারে।