使用 array_map() 访问第一级键而不调用 \`array_keys()\`

新手上路,请多包涵

有没有办法做这样的事情:

 $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_keysarray_values ,而是直接传递 $test_array 变量?

所需的输出是:

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

原文由 José Tomás Tocino 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 324
2 个回答

不适用于 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"
// }

原文由 eis 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您只需要一次,则 关闭 将起作用。我会使用 发电机

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

$x_result = (function(array $arr) {
    foreach ($arr as $key => $value) {
        yield "$key loves $value";
    }
})($test_array);

var_dump(iterator_to_array($x_result));

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

对于可重用的东西:

 function xmap(callable $cb, array $arr)
{
    foreach ($arr as $key => $value) {
        yield $cb($key, $value);
    }
}

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

原文由 None 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题