কীগুলি সহ পিএইচপি এর অ্যারে_ম্যাপ


208

এরকম কিছু করার কোনও উপায় আছে:

$test_array = array("first_key" => "first_value", 
                    "second_key" => "second_value");

var_dump(array_map(function($a, $b) { return "$a loves $b"; }, 
         array_keys($test_array), 
         array_values($test_array)));

পরিবর্তে কল করার পরিবর্তে array_keysএবং array_values, সরাসরি $test_arrayভেরিয়েবল পাস ?

কাঙ্ক্ষিত আউটপুট:

array(2) {
  [0]=>
  string(27) "first_key loves first_value"
  [1]=>
  string(29) "second_key loves second_value"
}

আরও দেখুন: stackoverflow.com/search?q=each_with_index এই সাধারণ সমস্যার একটি বিসদৃশ পদ্ধতির জন্য
dreftymac

উত্তর:


206

অ্যারে_ম্যাপ দিয়ে নয়, কারণ এটি কীগুলি পরিচালনা করে না।

অ্যারে_ওয়াক করেন:

$test_array = array("first_key" => "first_value",
                    "second_key" => "second_value");
array_walk($test_array, function(&$a, $b) { $a = "$b loves $a"; });
var_dump($test_array);

// array(2) {
//   ["first_key"]=>
//   string(27) "first_key loves first_value"
//   ["second_key"]=>
//   string(29) "second_key loves second_value"
// }

এটি প্যারামিটার হিসাবে প্রদত্ত অ্যারেগুলিকে পরিবর্তন করে না, সুতরাং এটি ঠিক কার্যকরী প্রোগ্রামিং নয় (যেমন আপনার কাছে প্রশ্নটি ট্যাগ করা থাকে)। এছাড়াও, মন্তব্যে উল্লিখিত হিসাবে, এটি কেবল অ্যারের মান পরিবর্তন করবে, সুতরাং কীগুলি আপনি প্রশ্নের মধ্যে নির্দিষ্ট করেছেন তা হবে না।

আপনি চাইলে এমন একটি ফাংশন লিখতে পারেন যা নিজের উপরের পয়েন্টগুলি ঠিক করে দিতে পারে:

function mymapper($arrayparam, $valuecallback) {
  $resultarr = array();
  foreach ($arrayparam as $key => $value) {
    $resultarr[] = $valuecallback($key, $value);
  }
  return $resultarr;
}

$test_array = array("first_key" => "first_value",
                    "second_key" => "second_value");
$new_array = mymapper($test_array, function($a, $b) { return "$a loves $b"; });
var_dump($new_array);

// array(2) {
//   [0]=>
//   string(27) "first_key loves first_value"
//   [1]=>
//   string(29) "second_key loves second_value"
// }

এই ক্ষেত্রে বাদে আপনি চান $a = "$b loves $a", ওপি'র পছন্দসই আউটপুটটি মেলাতে।
cmbuckley

1
সঠিক, পরিবর্তিত :) তারা অ্যারে_ওয়াক থেকে অ্যারে_ম্যাপটি কতটা আলাদা করেছেন তা খুব সুন্দর।
eis

সুন্দর ধন্যবাদ. আসল অ্যারেতে
গোলমাল

3
এটি "ক্রিয়ামূলক-প্রোগ্রামিং" নয় যদিও যেহেতু array_walk()ফলাফলের অ্যারেটি দেয় না, তবে পরিবর্তে একটি বুল হয়।
মে

@ হ্যাঁ হ্যাঁ, আমিও উত্তরটিতে যেমন লিখেছি - মান ফিরিয়ে দেওয়ার পরিবর্তে এটি প্যারামিটার পরিবর্তন করে
eis

145

এটি সম্ভবত সবচেয়ে সংক্ষিপ্ত এবং সহজ কারণ:

$states = array('az' => 'Arizona', 'al' => 'Alabama');

array_map(function ($short, $long) {
    return array(
        'short' => $short,
        'long'  => $long
    );
}, array_keys($states), $states);

// produces:
array(
     array('short' => 'az', 'long' => 'Arizona'), 
     array('short' => 'al', 'long' => 'Alabama')
)

15
আমি কেবল বুঝতে পেরেছি যে প্রশ্নটি বিশেষভাবে ব্যবহার না করার জন্য বলেছে array_keys()। যদিও এটি একটি নির্বোধ প্রয়োজনের মতো মনে হচ্ছে।
কেভিন বিল

3
প্রশ্নটি অ্যারে_কিজ () ব্যবহার করে একটি সমাধান সরবরাহ করেছিল, বর্তমান সমাধানের চেয়ে কোনও উত্তর নেই (যেমন, কম ফাংশন বলা) কোনও উত্তর প্রদান করা নির্বোধ হবে।
চিনোটো ভোকরো

মূল প্রশ্নের উত্তর হ'ল না, এবং এটিই সবচেয়ে উপযুক্ত সমাধান।
usoban

65

এখানে আমার খুব সাধারণ, পিএইচপি 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, একটি উচ্চ-অর্ডার ফাংশন মধ্যে নামক পরার ভাল যথেষ্ট হবে হতে পারে।


7
মনে হচ্ছে এটি সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত।
এডিউইল্ড

6
ধন্যবাদ @ এডিউইউল্ড, তবে আমি প্রায় 4½ বছর দেরী করেছি :) আমি এখানে একটি সমাধান খুঁজছিলাম, আমার পছন্দসই কোনও সন্ধান পেল না, তাই আমার নিজের সাথে হাজির।
নিকোলাস শ্যাঙ্কস

1
আমি যে লোক হতে হবে। এই উত্তরটির তারিখের জন্য পিএইচপি 5.3 এর আর প্রয়োজন হবে না । এই প্রোগ্রামটিতে।
এরুতান 409

1
আপনার প্রথম বিকল্প সমাধানটি অবৈধ। আপনি প্রতিস্থাপন করতে হবে array_mergeদ্বারা array_replaceকি যে পূর্ণসংখ্যার হবে সংরক্ষণে।
Alex83690

1
@ Alex83690 ধন্যবাদ! যদিও আমি বলব "অবৈধ" সামান্য বিভ্রান্তিকর - আপনার যদি কোনও পূর্ণসংখ্য কী না থাকে তবে তা ঠিক আছে (যেমনটি আমার নিজের ক্ষেত্রে সত্য ছিল)
নিকোলাস শ্যাঙ্কস

20

পিএইচপি 5.3 বা তার পরে:

$test_array = array("first_key" => "first_value", 
                    "second_key" => "second_value");

var_dump(
    array_map(
        function($key) use ($test_array) { return "$key loves ${test_array[$key]}"; },
        array_keys($test_array)
    )
);

1
আমি মনে করি প্রয়োজনীয়তাটি "অ্যারে_কিগুলি এবং অ্যারে_ভ্যালুগুলি কল করার পরিবর্তে সরাসরি" পরীক্ষা_আররে ভেরিয়েবলটি পাস করার "ছিল, এটি কি অ্যারে_কিগুলি ছাড়া ব্যবহার করা যেতে পারে?
eis

4

এইভাবে আমি আমার প্রকল্পে এটি বাস্তবায়ন করেছি।

function array_map_associative(callable $callback, $array) {
    /* map original array keys, and call $callable with $key and value of $key from original array. */
    return array_map(function($key) use ($callback, $array){
        return $callback($key, $array[$key]);
    }, array_keys($array));
}

খুব পরিষ্কার, এবং মূল অ্যারে পরিবর্তন করে না!
রাফায়েল ক্যান্ডেলিয়ার

4

এখানে দেখুন! তুচ্ছ সমাধান আছে!

function array_map2(callable $f, array $a)
{
    return array_map($f, array_keys($a), $a);
}

প্রশ্নে বর্ণিত হিসাবে, array_map ইতিমধ্যে সঠিকভাবে প্রয়োজনীয় কার্যকারিতা রয়েছে । অন্যান্য উত্তরগুলি এখানে গুরুতরভাবে জটিল বিষয়গুলি: array_walkকার্যকরী নয়।

ব্যবহার

ঠিক যেমনটি আপনি আপনার উদাহরণ থেকে আশা করবেন:

$test_array = array("first_key" => "first_value", 
                    "second_key" => "second_value");

var_dump(array_map2(function($a, $b) { return "$a loves $b"; }, $test_array));

অন্যান্য উত্তরগুলি জটিল বিষয়গুলিকে জটিল করে তোলে কারণ নির্দিষ্ট প্রশ্নটি # qrrqy_keys()কারণগুলির জন্য ব্যবহার করা উচিত নয়
ব্র্যাড কেন্ট

2

"ম্যানুয়াল লুপ" দ্বারা আমি বোঝাতে চাইছি এমন একটি কাস্টম ফাংশন লিখুন foreach। এটি এর মতো একটি নতুন অ্যারে প্রদান array_mapকরে কারণ ফাংশনটির স্কোপটি $arrayএকটি অনুলিপি তৈরি করে - রেফারেন্স নয়:

function map($array, callable $fn) {
  foreach ($array as $k => &$v) $v = call_user_func($fn, $k, $v);
  return $array;
}

যদিও এর array_mapসাথে ব্যবহার করার কৌশলটি আপনার কাছে array_keysসহজ বলে মনে হচ্ছে এবং এটি আরও শক্তিশালী কারণ আপনি nullকী-মান যুক্তগুলি ফিরিয়ে দিতে কলব্যাক হিসাবে ব্যবহার করতে পারেন :

function map($array, callable $fn = null) {
  return array_map($fn, array_keys($array), $array);
}

রেফারেন্স সহ অ্যারে লুপিং, ভুতুড়ে জিনিস ঘটতে পারে
janenz00

এটি উদ্ভট নয়, এর অর্থ কেবলমাত্র আপনি ভুলে গিয়েছিলেন unset( $value )কারণ এটি এখনও নির্ধারিত স্কোপে বিদ্যমান।
আজিজ পুঞ্জানী

@azis, নিবন্ধটি উল্লেখ করে ভুতুড়ে সম্পর্কে মজা করছিল। আপনি আনসেট করতে ভুলে গেলে এটি অপ্রত্যাশিত প্রভাব তৈরি করবে।
janenz00

1
উত্তরের জন্য ধন্যবাদ, তবে আমি ভেবেছিলাম এটি বেশ পরিষ্কার যে আমি একটি traditionalতিহ্যবাহী লুপটি ব্যবহার করতে চাই না।
হোসে টমসের টোকিনো

@ janenz00 স্পষ্টতার জন্য সম্পাদিত উত্তর দেখুন। আমি একটি পরিষ্কার পরিবর্তনশীল সুযোগে লুপিং বলতে চাইছি।
রায়ানভ

1

আইস এর উত্তরের ভিত্তিতে , মূল অ্যারেটিকে জগাখিচু করা এড়াতে আমি শেষ পর্যন্ত যা করেছি তা এখানে:

$test_array = array("first_key" => "first_value",
                    "second_key" => "second_value");

$result_array = array();
array_walk($test_array, 
           function($a, $b) use (&$result_array) 
           { $result_array[] = "$b loves $a"; }, 
           $result_array);
var_dump($result_array);

2
অ্যারে মানগুলি এবং কীগুলি সরাসরি অ্যারে_ম্যাপে পাস করার চেয়ে কেন এটি সহজ? এটি ধীর এবং আরও জটিল, আমি সুবিধাটি দেখছি না।
এরিয়েল

1
@ অ্যারিল আপনি কি এই দাবিটি ব্যাক আপ করতে পারেন যে এটি আরও ধীরে ধীরে ধীরে ধীরে হবে? এটি একবারে অ্যারে পুনরাবৃত্তি করা প্রয়োজন, তাই আমি মনে করি এটি বড় হে নোটেশনে দ্রুততর হওয়া উচিত। যদিও আমি জটিলতা সম্পর্কে একমত।
eis 20'14

@ আইস এটি ধীরে ধীরে কারণ এটি পিএইচপি-তে একবারে ফলাফলের অ্যারে তৈরি করে, সি তে ম্যাসেজ না করে এটি অ্যারে_কিগুলি কলটি এড়ানো যায় না (যদিও এটি সি এর পরে দ্রুত)। এটি বেঞ্চমার্ক করুন - দেখুন কোনটি দ্রুত, আমি সত্যই নিশ্চিত নই, তবে সাধারণত আরও কোড = ধীর কোড। জটিলতায় এটি অবশ্যই আরও খারাপ, এবং বেশিরভাগ সময় গতির চেয়ে এটি গুরুত্বপূর্ণ।
অ্যারিয়েল

1
বন্ধ করার সময় আপনি array_walkএটি উল্লেখ না করায় আপনাকে তৃতীয় আরগটি প্রেরণের দরকার নেই ।
স্টিভেন লু

1

আইআইএসের উত্তরের ভিত্তিতে আমি এই ফাংশনটি করেছি :

function array_map_($callback, $arr) {
    if (!is_callable($callback))
        return $arr;

    $result = array_walk($arr, function(&$value, $key) use ($callback) {
        $value = call_user_func($callback, $key, $value);
    });

    if (!$result)
        return false;

    return $arr;
}

উদাহরণ:

$test_array = array("first_key" => "first_value", 
                "second_key" => "second_value");

var_dump(array_map_(function($key, $value){
    return $key . " loves " . $value;
}, $arr));

আউটপুট:

array (
  'first_key' => 'first_key loves first_value,
  'second_key' => 'second_key loves second_value',
)

অবশ্যই, আপনি array_valuesওপি যা চান ঠিক তা ফিরিয়ে দিতে ব্যবহার করতে পারেন।

array_values(array_map_(function($key, $value){
    return $key . " loves " . $value;
}, $test_array))

@ কেভিনবিল এই কাজটি আমি আমার কাজে প্রচুর ব্যবহার করি। ত্রুটি কোথায় আছে আপনি বলতে পারেন?
জুলিও বেদোভাত্তো

2
প্রথমত, কোডটি যেমন দাঁড়িয়ে থাকে তেমন একটি চেক অনুপস্থিত যা $arrঅ্যারে টাইপের হয়, তবে আপনি যদি নিজের যুক্তিগুলি টাইপ-ইঙ্গিত করে থাকেন callableএবং arrayপরিবর্তে আপনি চেকটি ড্রপ করতে পারেন is_callable। এরপরে, আপনি $ মানের জন্য একটি অ্যাসাইনমেন্ট তৈরি করেন যা তখন অব্যবহৃত হয়। আপনার কেবল রিটার্নের মানটি উপেক্ষা করা উচিত। তৃতীয়ত, মিথ্যা প্রত্যাবর্তনের চেয়ে কলব্যাকে একটি ব্যতিক্রম ছুঁড়ে ফেলা ভাল। তারপরে আপনি হয় সর্বদা একটি বৈধ মান ফিরিয়ে দিন বা সর্বদা নিক্ষেপ করবেন।
নিকোলাস শ্যাঙ্কস

1

YaLinqo গ্রন্থাগার * এই ধরণের কাজের জন্য উপযুক্ত। এটি নেট থেকে লিনকিউয়ের একটি বন্দর যা সমস্ত কলব্যাকগুলিতে মান এবং কীগুলি সম্পূর্ণ সমর্থন করে এবং এসকিউএল এর অনুরূপ m উদাহরণ স্বরূপ:

$mapped_array = from($test_array)
    ->select(function ($v, $k) { return "$k loves $v"; })
    ->toArray();

বা শুধু:

$mapped_iterator = from($test_array)->select('"$k loves $v"');

এখানে, '"$k loves $v"'সম্পূর্ণ ক্লোজার সিনট্যাক্সের একটি শর্টকাট যা এই পাঠাগারটি সমর্থন করে। toArray()শেষ পর্যন্ত isচ্ছিক। পদ্ধতি শৃঙ্খলাটি একটি পুনরাবৃত্তি প্রদান করে, সুতরাং যদি ফলাফলটি ব্যবহার করে কেবল পুনরাবৃত্তি করা দরকার foreach,toArray কল সরিয়ে ফেলা যায়।

* আমার দ্বারা বিকাশিত


1

আমি এরকম কিছু করব:

<?php

/**
 * array_map_kv()
 *   An array mapping function to map with both keys and values.
 *
 * @param $callback callable
 *   A callback function($key, $value) for mapping values.
 * @param $array array
 *   An array for mapping.
 */
function array_map_kv(callable $callback, array $array) {
  return array_map(
    function ($key) use ($callback, $array) {
      return $callback($key, $array[$key]); // $callback($key, $value)
    },
    array_keys($array)
  );
}

// use it
var_dump(array_map_kv(function ($key, $value) {
  return "{$key} loves {$value}";
}, array(
  "first_key" => "first_value",
  "second_key" => "second_value",
)));

?>

ফলাফল:

array(2) {
  [0]=>
  string(27) "first_key loves first_value"
  [1]=>
  string(29) "second_key loves second_value"
}

1

আমি সংস্করণ 5.6 বা তার পরে ব্যবহার করে সমস্যার আরও একটি সমাধান যুক্ত করব। এটি ইতিমধ্যে দুর্দান্ত সমাধানগুলির (সম্ভবত না) চেয়ে বেশি দক্ষ কিনা তা জানেন না তবে আমার কাছে এটি পড়ার পক্ষে আরও সহজ:

$myArray = [
    "key0" => 0,
    "key1" => 1,
    "key2" => 2
];

array_combine(
    array_keys($myArray),
    array_map(
        function ($intVal) {
            return strval($intVal);
        },
        $myArray
    )
);

এর strval()উদাহরণ ফাংশন হিসাবে ব্যবহার করে array_map, এটি উত্পন্ন করবে:

array(3) {
  ["key0"]=>
  string(1) "0"
  ["key1"]=>
  string(1) "1"
  ["key2"]=>
  string(1) "2"
}

আশা করি আমি একমাত্র এমন ব্যক্তিই নন যাকে এই আঁকড়ে ধরার পক্ষে খুব সহজ পাওয়া যায়। কীগুলির একটি অ্যারে এবং মানগুলির array_combineএকটি key => valueঅ্যারে থেকে একটি অ্যারে তৈরি করে , বাকীটি বেশ স্ব ব্যাখ্যাযোগ্য।


1

আপনি সহজে যা চান সহজে ঠিক তা অর্জন করতে আপনি এই অ্যারে লাইব্রেরি থেকে মানচিত্রের পদ্ধতি ব্যবহার করতে পারেন :

Arr::map($test_array, function($a, $b) { return "$a loves $b"; });

এছাড়াও এটি কীগুলি সংরক্ষণ করে এবং নতুন অ্যারে প্রদান করে, আপনার প্রয়োজন অনুসারে কয়েকটি পৃথক পদ্ধতির উল্লেখ না করে।



0

আমি সবসময় অ্যারে মানচিত্রের জাভাস্ক্রিপ্ট ভেরিয়েন্ট পছন্দ করি। এর সর্বাধিক সহজ সংস্করণটি হ'ল:

/**
 * @param  array    $array
 * @param  callable $callback
 * @return array
 */
function arrayMap(array $array, callable $callback)
{
    $newArray = [];

    foreach( $array as $key => $value )
    {
        $newArray[] = call_user_func($callback, $value, $key, $array);
    }

    return $newArray;
}

সুতরাং এখন আপনি এটি একটি কলব্যাক ফাংশনটি পাস করতে পারেন কিভাবে মানগুলি তৈরি করবেন।

$testArray = [
    "first_key" => "first_value", 
    "second_key" => "second_value"
];

var_dump(
    arrayMap($testArray, function($value, $key) {
        return $key . ' loves ' . $value;
    });
);

এটা কোন ফাংশন আপনি লিখতে গত আর্গুমেন্ট হিসাবে তথ্য আছে আরো দরকারী তারপর আপনি একটি নতুন ফাংশন তৈরি যেমন করতে পারে bakes-ইন কিছু নির্দিষ্ট কলব্যাক (আচরণ) - অর্থাৎ আপনি ফাংশন রচনা পাবেন: h(g(f($data)))প্রযোজ্য f, তারপর g, তারপর hআপনার ডেটা। স্থির ডেটা সেটে বিভিন্ন ফাংশন প্রয়োগ করে এমন একটি ফাংশন রাখার চেয়ে ডাইভারের ডেটাগুলিতে একই ক্রিয়াকলাপ সম্পাদন করে এমন ফাংশন রাখা সাধারণত ফাংশনাল প্রোগ্রামিংয়ে আরও বহুমুখী বলে বিবেচিত হয়।
নিকোলাস শ্যাঙ্কস

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

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

পিএইচপি-র মতো ভাষায় কোনও রচনা ফাংশন ব্যবহার করা কি এই সমস্যার আরও ভাল সমাধান নয়?
ব্লেব্লব

1
এটি একটি বিকল্প তবে এফপিতে আরও বেশি বিনিয়োগের প্রয়োজন, উদাহরণস্বরূপ: github.com/nickshanks/fp-php-talk/blob/master/lib.php#L24 বা এটি: github.com/nickshanks/php-fp/blob / মাস্টার/src
নিকোলাস শ্যাঙ্কস

0

সংরক্ষণের কীগুলি (আউট) সংরক্ষণের সাথে এটি করার আরেকটি উপায়:

$test_array = [
    "first_key"     => "first_value",
    "second_key"    => "second_value"
];

$f = function($ar) {
    return array_map(
        function($key, $val) {
            return "{$key} - {$val}";
        },
        array_keys($ar),
        $ar
    );
};

#-- WITHOUT preserving keys
$res = $f($test_array);

#-- WITH preserving keys
$res = array_combine(
    array_keys($test_array),
    $f($test_array)
);

-2

আমি দেখতে পাচ্ছি যে এটির স্পষ্ট উত্তরটি অনুপস্থিত:

function array_map_assoc(){
    if(func_num_args() < 2) throw new \BadFuncionCallException('Missing parameters');

    $args = func_get_args();
    $callback = $args[0];

    if(!is_callable($callback)) throw new \InvalidArgumentException('First parameter musst be callable');

    $arrays = array_slice($args, 1);

    array_walk($arrays, function(&$a){
        $a = (array)$a;
        reset($a);
    });

    $results = array();
    $max_length = max(array_map('count', $arrays));

    $arrays = array_map(function($pole) use ($max_length){
        return array_pad($pole, $max_length, null);
    }, $arrays);

    for($i=0; $i < $max_length; $i++){
        $elements = array();
        foreach($arrays as &$v){
            $elements[] = each($v);
        }
        unset($v);

        $out = call_user_func_array($callback, $elements);

        if($out === null) continue;

        $val = isset($out[1]) ? $out[1] : null;

        if(isset($out[0])){
            $results[$out[0]] = $val;
        }else{
            $results[] = $val;
        }
    }

    return $results;
}

ঠিক অ্যারে_ম্যাপের মতো কাজ করে। প্রায়।

প্রকৃতপক্ষে, এটি mapঅন্যান্য ভাষাগুলি থেকে জানা হিসাবে এটি খাঁটি নয় । পিএইচপি খুব অদ্ভুত, সুতরাং এটির জন্য কিছু অতি অদ্ভুত ব্যবহারকারীর ফাংশন প্রয়োজন, কারণ আমরা আমাদের সঠিকভাবে ভাঙ্গা worse is betterপদ্ধতিকে মুক্ত করতে চাই না ।

সত্যই, এটি আসলে মোটেও mapনয়। তবুও, এটি এখনও খুব দরকারী।

  • অ্যারে_ম্যাপ থেকে প্রথম সুস্পষ্ট পার্থক্য হ'ল কলব্যাক each()একক মানের পরিবর্তে প্রতিটি ইনপুট অ্যারে থেকে আউটপুট নেয় । আপনি এখনও একবারে আরও অ্যারে মাধ্যমে পুনরাবৃত্তি করতে পারেন।

  • দ্বিতীয় পার্থক্য হ'ল কীটি কলব্যাক থেকে ফিরে আসার পরে পরিচালনা করা হয়; কলব্যাক ফাংশন থেকে ফেরতের মান হওয়া উচিত array('new_key', 'new_value')। কীগুলি পরিবর্তন করতে হবে এবং তা পরিবর্তন করা হবে, একই কীগুলি যদি পূর্ববর্তী মানটি পুনর্নির্মাণের কারণ হতে পারে তবে একই কীটি ফেরত দেওয়া হয়। এটি সাধারণ mapব্যবহার নয়, তবুও এটি আপনাকে কীগুলি পুনরায় লেখার অনুমতি দেয়।

  • তৃতীয় অদ্ভুত বিষয়টি হ'ল, আপনি keyযদি রিটার্ন ভ্যালুতে (উভয় দ্বারা array(1 => 'value')বা array(null, 'value')) বাদ দেন তবে নতুন কী বরাদ্দ করা হবে, যেমন $array[] = $valueব্যবহার করা হয়েছিল। যে হয় না mapএর সাধারণ আচরণ পারেন, এখনো এটি কুশলী কখনও কখনও আসে, আমি অনুমান।

  • চতুর্থ অদ্ভুত বিষয়টি হ'ল, যদি কলব্যাক ফাংশনটি কোনও মান দেয় না, বা ফিরে আসে null, বর্তমান কী এবং মানগুলির পুরো সেটটি আউটপুট থেকে বাদ দেওয়া হয়, তবে এটি সহজেই এড়িয়ে যায়। এই বৈশিষ্ট্যটি সম্পূর্ণরূপে আন mapপি নয়, তবুও array_filter_assocযদি এই ধরনের ফাংশন থাকে তবে এটি এই ফাংশনটিকে দুর্দান্ত স্টান্ট দ্বিগুণ করে তুলবে ।

  • যদি আপনি কলব্যাকের রিটার্নে দ্বিতীয় উপাদান ( 1 => ...) ( মান অংশ) বাদ দেন তবে nullআসল মানের পরিবর্তে ব্যবহৃত হয়।

  • কীগুলি 0এবং 1কলব্যাকের রিটার্ন ব্যতীত অন্য কোনও উপাদান উপেক্ষা করা হবে।

  • এবং পরিশেষে, লাম্বদা যদি আর nullঅ্যারে ব্যতীত কোনও মান প্রদান করে তবে এটি কী এবং মান উভয় বাদ দেওয়া হয়েছে বলে মনে করা হয়, তাই:

    1. উপাদান জন্য নতুন কী বরাদ্দ করা হয়
    2. null এটির মান হিসাবে ব্যবহৃত হয়
সতর্কতা:
মনে রাখবেন, এই শেষ বৈশিষ্ট্যটি পূর্ববর্তী বৈশিষ্ট্যগুলির কেবলমাত্র একটি অবশিষ্টাংশ এবং এটি সম্ভবত সম্পূর্ণ অকেজো। এই বৈশিষ্ট্যটির উপর নির্ভর করা অত্যন্ত নিরুৎসাহিত করা হয়েছে, কারণ এই বৈশিষ্ট্যটি এলোমেলোভাবে হ্রাস পাচ্ছে এবং ভবিষ্যতের প্রকাশগুলিতে অপ্রত্যাশিতভাবে পরিবর্তন হবে।

দ্রষ্টব্য: এর
বিপরীতে array_map, array_map_assocপ্রথম কলব্যাক প্যারামিটার বাদে সমস্ত নন-অ্যারে প্যারামিটারগুলি নীরবে অ্যারেতে কাস্ট করা হয়।

উদাহরণ:
// TODO: examples, anyone?

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