অন্যান্য উত্তরগুলি অ্যারে_ওয়াকের (পার্স-প্লেস মডিফিকেশন) এবং অ্যারে_ম্যাপের (পরিবর্তিত পরিবর্তিত অনুলিপি) মধ্যে পার্থক্যটি বেশ ভালভাবে দেখায়। তবে তারা সত্যই অ্যারে_রেডস উল্লেখ করে না, যা অ্যারে_ম্যাপ এবং অ্যারে_ফিল্টার বোঝার এক আলোকিত উপায়।
অ্যারে_ড্রেস ফাংশনটি একটি অ্যারে, একটি দ্বি-আর্গুমেন্ট ফাংশন এবং একটি 'সংযোজক' গ্রহণ করে:
array_reduce(array('a', 'b', 'c', 'd'),
'my_function',
$accumulator)
অ্যারের উপাদানগুলি প্রদত্ত ফাংশনটি ব্যবহার করে একবারে সঞ্চয়ের সাথে একত্রিত হয়। উপরোক্ত কলটির ফলাফল এটি করার মতোই:
my_function(
my_function(
my_function(
my_function(
$accumulator,
'a'),
'b'),
'c'),
'd')
আপনি যদি লুপগুলির বিবেচনায় ভাবতে পছন্দ করেন তবে এটি নিম্নলিখিতগুলি করার মতো হয় (অ্যারে_ড্রেস পাওয়া না গেলে আমি আসলে এটি ফ্যালব্যাক হিসাবে ব্যবহার করেছি):
function array_reduce($array, $function, $accumulator) {
foreach ($array as $element) {
$accumulator = $function($accumulator, $element);
}
return $accumulator;
}
এই লুপিং সংস্করণটি এটিকে পরিষ্কার করে দিয়েছে যে আমি তৃতীয় যুক্তিটিকে কেন 'সংশ্লেষক' বলেছি: আমরা প্রতিটি পুনরুক্তির মাধ্যমে ফলাফল সংগ্রহ করতে এটি ব্যবহার করতে পারি।
সুতরাং এটির সাথে অ্যারে_ম্যাপ এবং অ্যারে_ফিল্টার কী আছে? দেখা যাচ্ছে যে তারা উভয়ই একটি বিশেষ ধরণের অ্যারে_ড্রেস। আমরা তাদের এভাবে প্রয়োগ করতে পারি:
array_map($function, $array) === array_reduce($array, $MAP, array())
array_filter($array, $function) === array_reduce($array, $FILTER, array())
অ্যারে_ম্যাপ এবং অ্যারে_ ফিল্টার তাদের যুক্তিগুলি একটি ভিন্ন ক্রমে গ্রহণ করে তা উপেক্ষা করুন; এটি পিএইচপি এর অন্য এক কৌতুক। গুরুত্বপূর্ণ বিষয়টি হ'ল ডান হাতের দিকটি the এমএপি এবং $ ফিল্টার বলেছি এমন ফাংশনগুলি বাদে is তো, তারা দেখতে কেমন?
$MAP = function($accumulator, $element) {
$accumulator[] = $function($element);
return $accumulator;
};
$FILTER = function($accumulator, $element) {
if ($function($element)) $accumulator[] = $element;
return $accumulator;
};
যেমন আপনি দেখতে পাচ্ছেন, উভয় ফাংশনই $ সঞ্চালক গ্রহণ করে এবং এটি আবার ফিরিয়ে দেয়। এই ফাংশনগুলিতে দুটি পার্থক্য রয়েছে:
- AP এমএপি সর্বদা $ সঞ্চয়ের জন্য সংযোজন করবে, তবে $ ফাংশন ($ উপাদান) সত্য হলে IL ফিল্টার কেবল তা করবে।
- IL ফিল্টার মূল উপাদানটি সংযোজন করে তবে $ এমএপি app ফাংশন ($ উপাদান) সংযোজন করে।
নোট করুন যে এটি অকেজো ট্রিভিয়া থেকে অনেক দূরে; আমরা আমাদের অ্যালগোরিদমকে আরও দক্ষ করতে এটি ব্যবহার করতে পারি!
আমরা প্রায়শই এই দুটি উদাহরণের মতো কোড দেখতে পারি:
// Transform the valid inputs
array_map('transform', array_filter($inputs, 'valid'))
// Get all numeric IDs
array_filter(array_map('get_id', $inputs), 'is_numeric')
লুপগুলির পরিবর্তে অ্যারে_ম্যাপ এবং অ্যারে_ ফিল্টার ব্যবহার করা এই উদাহরণগুলিকে বেশ সুন্দর দেখায়। তবে, very ইনপুটগুলি বড় হলে এটি অত্যন্ত অযোগ্য হতে পারে, যেহেতু প্রথম কল (মানচিত্র বা ফিল্টার) call ইনপুটগুলি অতিক্রম করবে এবং একটি মধ্যবর্তী অ্যারে তৈরি করবে। এই মধ্যবর্তী অ্যারেটি সরাসরি দ্বিতীয় কলটিতে চলে যায়, যা পুরো জিনিসটি আবার অতিক্রম করবে, তারপরে মধ্যবর্তী অ্যারে আবর্জনা সংগ্রহ করা দরকার।
অ্যারে_ম্যাপ এবং অ্যারে_ ফিল্টার উভয়ই অ্যারে_ড্রেস উদাহরণ examples এটিকে কাজে লাগিয়ে আমরা এই মধ্যবর্তী অ্যারে থেকে মুক্তি পেতে পারি। তাদের সংযুক্ত করে, আমাদের কেবল প্রতিটি উদাহরণে একবার $ ইনপুটগুলি ট্র্যাভার করতে হবে:
// Transform valid inputs
array_reduce($inputs,
function($accumulator, $element) {
if (valid($element)) $accumulator[] = transform($element);
return $accumulator;
},
array())
// Get all numeric IDs
array_reduce($inputs,
function($accumulator, $element) {
$id = get_id($element);
if (is_numeric($id)) $accumulator[] = $id;
return $accumulator;
},
array())
দ্রষ্টব্য: উপরে অ্যারে_ম্যাপ এবং অ্যারে_ফিল্টারের আমার প্রয়োগগুলি পিএইচপি এর মতো ঠিক আচরণ করবে না, যেহেতু আমার অ্যারে_ম্যাপটি একবারে কেবলমাত্র একটি অ্যারে পরিচালনা করতে পারে এবং আমার অ্যারে_ফিল্টারটি তার ডিফল্ট "ফাংশন হিসাবে" খালি "ব্যবহার করবে না। এছাড়াও, উভয়ই কীগুলি সংরক্ষণ করবে না।
তাদের পিএইচপি-র মতো আচরণ করা কঠিন নয়, তবে আমি অনুভব করেছি যে এই জটিলতাগুলি মূল ধারণাটি আরও শক্ত করে তুলবে।