281

このようなことをする方法はありますか?

$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しかし、 andを呼び出す代わりに、変数array_valuesを直接渡すのですか?$test_array

必要な出力は次のとおりです。

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

19 に答える 19

262

キーを処理しないため、array_mapでは使用できません。

array_walkは:

$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"
// }
于 2012-10-23T17:51:18.810 に答える
21

PHP5.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)
    )
);
于 2014-01-28T13:45:06.030 に答える
6

ここを見て!ささやかな解決策があります!

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));
于 2018-09-05T10:27:43.947 に答える
3

「手動ループ」とは、を使用するカスタム関数を作成することを意味しましたforeacharray_mapこれは、関数のスコープが$array参照ではなくコピーになるため、新しい配列を返します。

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

キーと値のペアを返すコールバックとして使用できるため、 array_mapwithを使用する手法array_keysは実際にはよりシンプルで強力に見えます。null

function map($array, callable $fn = null) {
  return array_map($fn, array_keys($array), $array);
}
于 2012-10-23T17:45:57.720 に答える
1

私はeisの答えに基づいて、この関数を作りました:

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_valuesOPが望むものを正確に返すために使用できます。

array_values(array_map_(function($key, $value){
    return $key . " loves " . $value;
}, $test_array))
于 2015-04-01T20:25:13.977 に答える
1

YaLinqoライブラリー* は、この種のタスクに適しています。これは .NET からの LINQ のポートであり、すべてのコールバックで値とキーを完全にサポートし、SQL に似ています。例えば:

$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()最後にオプションです。メソッド チェーンは反復子を返すため、 を使用して結果を反復処理する必要がある場合はforeachtoArray呼び出しを削除できます。

※私が開発した

于 2015-06-04T13:36:39.940 に答える
1

eis's answerに基づいて、元の配列を台無しにしないために最終的に行ったことは次のとおりです。

$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);
于 2012-10-23T21:10:24.887 に答える