অ্যারে_ম্যাপ, অ্যারে_ওয়াক এবং অ্যারে_ফিল্টারের মধ্যে পার্থক্য


373

ঠিক কি মধ্যে পার্থক্য array_map, array_walkএবং array_filter। ডকুমেন্টেশন থেকে আমি যা দেখতে পাচ্ছি তা হ'ল আপনি সরবরাহিত অ্যারেতে কোনও ক্রিয়া সম্পাদনের জন্য কলব্যাক ফাংশনটি পাস করতে পারেন। তবে আমি তাদের মধ্যে কোনও বিশেষ পার্থক্য খুঁজে পেয়েছি বলে মনে হয় না।

তারা কি একই জিনিস সম্পাদন করে?
এগুলি কি বিনিময়যোগ্যভাবে ব্যবহার করা যায়?

উদাহরণস্বরূপ উদাহরণ সহকারে আপনার সাহায্যের প্রশংসা করব যদি সেগুলি একেবারেই আলাদা হয়।


অ্যারে_ড্রেস () এর মাধ্যমে নামযুক্ত অ্যারে প্রসেসিংয়ের জন্য এটি একটি দুর্দান্ত কৌশল। যদি আপনি অ্যারে_ম্যাপ, অ্যারে_ওয়াক এবং অ্যারে_ফিল্টারটি তদন্ত করছেন তবে পাঠ্যযোগ্য th stackoverflow.com/questions/11563119/…
ল্যান্স ক্লিভল্যান্ড

উত্তর:


564
  • পরিবর্তিত মান:
    • array_mapইনপুট অ্যারে (গুলি) এর অভ্যন্তরে মানগুলি পরিবর্তন করতে পারে না array_walk; বিশেষত, array_mapএর যুক্তিগুলি কখনই পরিবর্তন করে না।
  • অ্যারে কী অ্যাক্সেস:
    • array_mapঅ্যারে কীগুলির সাহায্যে পরিচালনা করতে পারে না array_walk
  • ফেরত মূল্য:
    • array_mapএকটি নতুন অ্যারে প্রদান করে, array_walkকেবল ফেরত দেয় true। অতএব, যদি আপনি একটি অ্যারে অনুসরণের ফলাফল হিসাবে কোনও অ্যারে তৈরি করতে না চান তবে আপনার ব্যবহার করা উচিত array_walk
  • একাধিক অ্যারে আইট্রেটিং:
    • array_mapএছাড়াও একটি স্বেচ্ছাসেবী সংখ্যক অ্যারে গ্রহণ করতে পারে এবং এটি তাদের উপর সমান্তরালে পুনরাবৃত্তি করতে পারে, যখন array_walkকেবল একটিতে কাজ করে।
  • কলব্যাকে স্বেচ্ছাসেবীর ডেটা পাস করা:
    • array_walkকলব্যাকটি পাস করার জন্য একটি অতিরিক্ত স্বেচ্ছাচারিত প্যারামিটার গ্রহণ করতে পারে। এটি পিএইচপি 5.3 সাল থেকে অপ্রাসঙ্গিক (যখন বেনাম ফাংশনগুলি চালু করা হয়েছিল)।
  • ফিরে আসা অ্যারের দৈর্ঘ্য:
    • ফলাফলের অ্যারের array_mapবৃহত্তম দৈর্ঘ্যের ইনপুট অ্যারের সমান দৈর্ঘ্য রয়েছে; array_walkএকটি অ্যারে ফেরত দেয় না তবে একই সাথে এটি মূল অ্যারের উপাদানগুলির সংখ্যাও পরিবর্তন করতে পারে না; array_filterফিল্টারিং ফাংশন অনুযায়ী অ্যারের উপাদানগুলির কেবলমাত্র একটি উপসেট বেছে নেয়। এটি কীগুলি সংরক্ষণ করে।

উদাহরণ:

<pre>
<?php

$origarray1 = array(2.4, 2.6, 3.5);
$origarray2 = array(2.4, 2.6, 3.5);

print_r(array_map('floor', $origarray1)); // $origarray1 stays the same

// changes $origarray2
array_walk($origarray2, function (&$v, $k) { $v = floor($v); }); 
print_r($origarray2);

// this is a more proper use of array_walk
array_walk($origarray1, function ($v, $k) { echo "$k => $v", "\n"; });

// array_map accepts several arrays
print_r(
    array_map(function ($a, $b) { return $a * $b; }, $origarray1, $origarray2)
);

// select only elements that are > 2.5
print_r(
    array_filter($origarray1, function ($a) { return $a > 2.5; })
);

?>
</pre>

ফলাফল:

Array
(
    [0] => 2
    [1] => 2
    [2] => 3
)
Array
(
    [0] => 2
    [1] => 2
    [2] => 3
)
0 => 2.4
1 => 2.6
2 => 3.5
Array
(
    [0] => 4.8
    [1] => 5.2
    [2] => 10.5
)
Array
(
    [1] => 2.6
    [2] => 3.5
)

3
পিএইচপি ম্যানুয়ালটি বলে: "অ্যারে_ওয়াক (): কেবল অ্যারের মানগুলি সম্ভবত পরিবর্তন করা যেতে পারে;"
ফিয়েল

10
"অ্যারে_ম্যাপ অ্যারে কীগুলি নিয়ে কাজ করতে পারে না" এটি সত্য নয়:array_map(callback($key, $value), array_keys($array), $array)
জারেক জাকুবভস্কি

12
এটি এখনও কোনও অ্যারের কীগুলি অ্যাক্সেস করছে না, আপনি কীগুলি থেকে তৈরি করেছেন এমন অ্যারেতে রাখা মানগুলিকে অ্যাক্সেস করছে। এটি একটি কার্যনির্বাহী, এটি বিবৃতিটিকে অস্বীকার করে না।
inarilo

অ্যারে_ম্যাপটি স্পষ্টতই মানগুলি পরিবর্তন করে না, ফলাফলটিকে একই অ্যারেতে নির্ধারিত করে এটি মূলত এটি পরিবর্তন করে এবং 'প্যারাডক্সিকালি' অ্যারে_ওয়াক যা একই অ্যারেতে চালিত হয় নিজেই তার মানগুলি সরাসরি পরিবর্তন করতে পারে না, যদি না রেফারেন্স অনুসারে মান পাস হয় (অ্যারে ওয়াক ইনডেক্স / উপাদানগুলি অপ্রত্যাশিতভাবে বেনামে ফাংশন ব্যবহারের মাধ্যমে মূল অ্যারে পাস করে ক্লজ ব্যবহারের মাধ্যমে অ্যারে_ ফিল্টার হিসাবে অপসারণ করতে পারে তবে এটি কার্যকর নয়)। এই উপসংহারে, মান পরিবর্তন করা, বা কোনও মান রেফারেন্স দ্বারা প্রেরণ বা পাস করা কার্যকরভাবে কম পার্থক্য না থাকলেও অ্যারে ওয়াক একাধিক অ্যারে সহ সূচী এবং অ্যারে মানচিত্রের সাথে কাজ করে
FentomX1

তবুও দেখে মনে হচ্ছে যে অ্যারে
ওয়াকটি

91

ডেটা অ্যারেতে কোনও ফাংশন ম্যাপিংয়ের ধারণাটি কার্যকরী প্রোগ্রামিং থেকে আসে। আপনাকে লুপ array_mapহিসাবে ভাববেন না foreachযা অ্যারের প্রতিটি উপাদানকে একটি ক্রিয়াকলাপ বলে ডাকে (যদিও এটি এটি কার্যকর হয়)। এটি অ্যারের প্রতিটি উপাদানগুলিতে ফাংশনটি স্বাধীনভাবে প্রয়োগ করার কথা ভাবা উচিত।

তত্ত্ব অনুসারে ফাংশন ম্যাপিংয়ের মতো জিনিসগুলি সমান্তরালভাবে করা যেতে পারে যেহেতু ডাটাতে প্রয়োগ করা ফাংশনটি কেবলমাত্র ডেটাগুলিকে প্রভাবিত করে বিশ্বব্যাপী রাষ্ট্রকে নয়। এর কারণ এটি array_mapকোনও আইটেমগুলিতে ফাংশনটি প্রয়োগ করতে যে কোনও আদেশ চয়ন করতে পারে (যদিও পিএইচপি তে তা না করে)।

array_walkঅন্যদিকে এটি ডেটার অ্যারে পরিচালনা করার জন্য ঠিক বিপরীত পদ্ধতি। প্রতিটি আইটেম পৃথকভাবে পরিচালনা করার পরিবর্তে, এটি একটি রাষ্ট্র ( &$userdata) ব্যবহার করে এবং আইটেমটি জায়গায় সম্পাদনা করতে পারে (অনেকটা ফোরচ লুপের মতো)। যেহেতু প্রতিটি বার কোনও আইটেম এটি $funcnameপ্রয়োগ করে তাই এটি প্রোগ্রামের বিশ্বব্যাপী অবস্থার পরিবর্তন করতে পারে এবং এর জন্য আইটেমগুলি প্রক্রিয়া করার একক সঠিক উপায় প্রয়োজন ।

পিএইচপি জমিতে ফিরে, array_mapএবং array_walkপ্রায় একই রকম বাদে array_walkআপনাকে ডেটার পুনরাবৃত্তির উপর আরও নিয়ন্ত্রণ দেয় এবং সাধারণত কোনও নতুন "পরিবর্তিত" অ্যারে ফিরিয়ে বনাম স্থানে থাকা ডেটা "পরিবর্তন" করতে ব্যবহৃত হয়।

array_filterআসলেই array_walk(বা array_reduce) এর একটি অ্যাপ্লিকেশন এবং এটি কেবলমাত্র সুবিধার জন্য সরবরাহ করা হয়েছে more


5
"তৃতীয় ক্ষেত্রে ফাংশন ম্যাপিংয়ের মতো জিনিসগুলি সমান্তরালভাবে করা যেতে পারে যেহেতু ডেটাতে প্রয়োগ করা ফাংশনটি কেবলমাত্র তথ্যকে প্রভাবিত করে বিশ্বব্যাপী অবস্থাকে নয়" " আমাদের সমান্তরাল প্রোগ্রামারদের জন্য, এটি মনে রাখা একটি দরকারী জিনিস।
ইথারিস

আপনি কীভাবে array_filter()ব্যবহার করে বাস্তবায়ন করতে পারবেন তা ব্যাখ্যা করতে পারেন array_walk()?
pfrenssen

40

ডকুমেন্টেশন থেকে,

বুল অ্যারে_ওয়াক (অ্যারে এবং $ অ্যারে, কলব্যাক $ ফানকাম [, মিশ্র $ ইউজারডাটা]) <

অ্যারে_ওয়াক একটি অ্যারে এবং একটি ফাংশন নেয় Fএবং প্রতিটি উপাদান x এর সাথে প্রতিস্থাপন করে এটিকে সংশোধন করে F(x)

অ্যারে অ্যারে_ম্যাপ (কলব্যাক $ কলব্যাক, অ্যারে $ আরআর 1 [, অ্যারে $ ...]) <- রিটার্ন অ্যারে

অ্যারে_ম্যাপ ঠিক একই জিনিসটি ব্যতীত স্থান পরিবর্তন করে পরিবর্তিত উপাদানগুলির সাথে একটি নতুন অ্যারে ফিরিয়ে দেবে except

অ্যারে অ্যারে_ফিল্টার (অ্যারে $ ইনপুট [, কলব্যাক $ কলব্যাক]) <- রিটার্ন অ্যারে

ফাংশন সহ অ্যারে_ ফিল্টারF উপাদানগুলির পরিবর্তনের পরিবর্তে কোনও উপাদান মুছে ফেলবে যার F(x)জন্য এটি সত্য নয়


আমার অ্যারে মানগুলি কেন অদৃশ্য হয়ে গেল তা বুঝতে পারিনি। ডকুমেন্টেশনের দিকে তাকিয়ে আমি ধরে নিয়েছি array_walkএকটি অ্যারের মত ফিরিয়ে দিয়েছি array_mapএবং বুঝতে পেরেছি যে বিষয়টি আমার ফাংশনে রয়েছে। রিটার্নের ধরণটি বুলিয়ান যা না হওয়া পর্যন্ত আমি বুঝতে পারি নি।
ডিলান ভালাদ

22

অন্যান্য উত্তরগুলি অ্যারে_ওয়াকের (পার্স-প্লেস মডিফিকেশন) এবং অ্যারে_ম্যাপের (পরিবর্তিত পরিবর্তিত অনুলিপি) মধ্যে পার্থক্যটি বেশ ভালভাবে দেখায়। তবে তারা সত্যই অ্যারে_রেডস উল্লেখ করে না, যা অ্যারে_ম্যাপ এবং অ্যারে_ফিল্টার বোঝার এক আলোকিত উপায়।

অ্যারে_ড্রেস ফাংশনটি একটি অ্যারে, একটি দ্বি-আর্গুমেন্ট ফাংশন এবং একটি 'সংযোজক' গ্রহণ করে:

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())

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

তাদের পিএইচপি-র মতো আচরণ করা কঠিন নয়, তবে আমি অনুভব করেছি যে এই জটিলতাগুলি মূল ধারণাটি আরও শক্ত করে তুলবে।


1

নিম্নলিখিত সংশোধনটি পিএইচপি-র অ্যারে_ফিলার (), অ্যারে_ম্যাপ () এবং অ্যারে_ওয়াক () এর আরও স্পষ্টরূপে চিত্রিত করার চেষ্টা করে, যার সবগুলিই কার্যকরী প্রোগ্রামিং থেকে উদ্ভূত:

অ্যারে_ফিল্টার () ডেটা ফিল্টার করে, ফলস্বরূপ উত্পাদন করে একটি নতুন অ্যারে কেবল পূর্ব অ্যারের কেবল পছন্দসই আইটেমকে ধারণ করে:

<?php
$array = array(1, "apples",2, "oranges",3, "plums");

$filtered = array_filter( $array, "ctype_alpha");
var_dump($filtered);
?>

লাইভ কোড এখানে

সমস্ত সংখ্যাসূচক মানগুলি কেবলমাত্র প্রকারের ফলের সাথে ফিল্টার করে $ অ্যারে থেকে ফিল্টার হয়।

অ্যারে_ম্যাপ () এছাড়াও একটি নতুন অ্যারে তৈরি করে তবে অ্যারে_ফিল্টার () এর বিপরীতে ফলাফল অ্যারেতে প্রতিটি উপাদানগুলিতে কলব্যাক প্রয়োগের কারণে ফিল্টারযুক্ত তবে পরিবর্তিত মান সহ ইনপুটটির প্রতিটি উপাদান থাকে contains

<?php

$nu = array_map( "strtoupper", $filtered);
var_dump($nu);
?>

লাইভ কোড এখানে

এই ক্ষেত্রে কোডটি বিল্ট-ইন স্ট্র্টউপার () ব্যবহার করে একটি কলব্যাক প্রয়োগ করে তবে একটি ব্যবহারকারী-সংজ্ঞায়িত ফাংশনও একটি আরও কার্যকর বিকল্প। কলব্যাক tered ফিল্টার করা এবং এর মাধ্যমে এনগ্রেডার্স $ nu এর প্রতিটি আইটেমের জন্য প্রযোজ্য যার উপাদানগুলিতে বড় হাতের মান রয়েছে।

পরবর্তী স্নিপেটে, অ্যারে হাঁটা () vers n কে অনুসরণ করে এবং প্রতিটি উপাদানকে রেফারেন্স অপারেটরের 'এবং' এর পরিবর্তে পরিবর্তন করে। অতিরিক্ত অ্যারে তৈরি না করেই পরিবর্তনগুলি ঘটে। প্রতিটি উপাদানটির মান পরিবর্তিত হয় আরও তথ্যমূলক স্ট্রিংয়ে এর কী, বিভাগ এবং মান উল্লেখ করে।

<?php

$f = function(&$item,$key,$prefix) {
    $item = "$key: $prefix: $item";
}; 
array_walk($nu, $f,"fruit");
var_dump($nu);    
?>    

ডেমো দেখুন

দ্রষ্টব্য: অ্যারে_ওয়াক () এর সাথে সম্মত কলব্যাক ফাংশনটিতে দুটি পরামিতি লাগে যা স্বয়ংক্রিয়ভাবে কোনও উপাদানটির মান এবং এর কীটি অর্জন করবে এবং সেই ক্রমে, অ্যারে_ওয়াক () দ্বারা আহ্বান করলেও। (আরও দেখুন এখানে )।


1
মনে রাখবেন যে ফাংশনগুলি $lambdaএবং $callbackকেবল বিদ্যমান ফাংশনগুলির এটা-এক্সপেনশন এবং সেহেতু সম্পূর্ণ অপ্রয়োজনীয়। অন্তর্নিহিত ফাংশনটি পাস করার মাধ্যমে আপনি একই ফলাফল পেতে পারেন: $filtered = array_filter($array, 'ctype_alpha');এবং$nu = array_map('strtoupper', $filtered);
ওয়ারবো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.