`array_keys()` を呼び出さずに array_map() で第 1 レベルのキーにアクセスする 質問する

`array_keys()` を呼び出さずに array_map() で第 1 レベルのキーにアクセスする 質問する

次のような方法はありますか:

$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"
}

ベストアンサー1

array_map ではキーを処理しないため、そうではありません。

配列ウォーク行う:

$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"
// }

おすすめ記事