【问题标题】:How can I use array_map with keys and values, but return an array with the same indexes (not int)?如何将 array_map 与键和值一起使用,但返回具有相同索引(不是 int)的数组?
【发布时间】:2014-10-20 05:22:29
【问题描述】:

我有一个数组,例如['id' => 1, 'name' => 'Fred']

我想在这个数组上调用array_map 并使用函数内部的键。但是,当我返回时,我的键将变为 int。

简单示例:

$arr = array('id' => 1, 'name' => 'Fred');
$result = array_map(
    function ($value, $key) {
        return $value;
     },
     $arr,
     array_keys($arr)
);
var_dump($result);

基本上,在这种情况下,我希望$result$arr 相同,但它会将我的字符串键转换为整数。

【问题讨论】:

  • 你需要展示你想要的结果。这可以正常工作。
  • 来自文档“如果数组参数包含字符串键,则返回的数组将包含字符串键当且仅当仅传递一个数组。如果传递了多个参数,则返回数组总是有整数键。" (强调我的)
  • array_map() 是不适合这项工作的工具。向我们展示您在这一天真正想做什么。

标签: php arrays associative-array array-map


【解决方案1】:

使用array_map() 最接近的是:

<?php
$arr = array('id'=>1,'name'=>'Jon');

$callback = function ($key, $value) {
    return array($key => $value);
  };

$arr = array_map( $callback, array_keys($arr), $arr);
var_dump($arr);
?>

给予:

   [
     [
       "id" => 1
     ],
     [
       "name" => "Jon"
     ]
   ]

你会更好地创建你自己的函数,里面有一个foreach

【讨论】:

    【解决方案2】:

    对于“我要调用array_map”和“$result 与$arr 相同”的要求,请尝试:

    $result = array_combine(
         array_keys($arr), 
         array_map(function($v){ return $v; }, $arr)
    );
    

    给予:

       [
         "id" => 1
         "name" => "Fred"
       ]
    

    但是,嘿,如果你想要的只是相同的数组,那么没有什么比这段代码更好的了:

    $result = $arr;
    

    【讨论】:

      【解决方案3】:

      您需要的是array_walk。 试试这个代码:

      $arr = array('id' => 1, 'name' => 'Fred');
      array_walk(
          $arr,
          function (&$value, $key) {
              // do stuff
           }
      );
      print_r($arr);
      

      不幸的是,当您尝试更改键时,它不起作用。但是您可以在通过引用传递它们时更改这些值。

      如果您也必须更改密钥,请检查 Question to array_walk-change-keys 和第一个答案:

      【讨论】:

        【解决方案4】:

        基于@Jannie Theunissen 的回答,正确的方法是让 array_map 使用键来比较和分配基于第二个数组的值,例如:

        $result = array_combine(
         array_keys($arr), 
         array_map(function($v, $key){ return $v; }, $arr, array_keys($arr))
        );
        

        或优化替代方案:

        $keys = array_keys($arr);
        $result = array_combine(
         $keys, 
         array_map(function($v, $key){ return $v; }, $arr, $keys)
        );
        

        并带有一个比较数组值:

        $compareArray = [/*same structure as $arr but with specific values*/];
        $keys = array_keys($arr);
        $result = array_combine(
         $keys, 
         array_map(function($v, $key) use ($compareArray) { 
                      // recursive can be achieved here passing $v and $compareArray[$key]
                      return $compareArray[$key]; 
                   }, $arr, $keys)
        );
        

        【讨论】:

          【解决方案5】:

          这个想法很简单。您需要在 array_map() 函数中使用键。

          为此,我们添加了两个数组:第一个 array_keys($array) 我们传递主数组的键,第二个 $array 是所需的数组。

          array_map(function($key, $value) {
          
                 // use your key here ...
                 return $processed_value;
          
              }, array_keys($array), $array)
          

          从现在开始:您可以使用$key 作为第一个参数的值,将$value 作为第二个参数。

          【讨论】:

          • 如果你能在你的解决方案中添加一些解释的话会很好
          • 没错。谢谢你的评论。我已经用描述更新了我的解决方案。
          猜你喜欢
          • 2019-05-25
          • 2021-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-11
          相关资源
          最近更新 更多