【问题标题】:How do I use the PHP array_walk function to rearrange keys in a multidimensional array?如何使用 PHP array_walk 函数重新排列多维数组中的键?
【发布时间】:2019-10-01 13:17:27
【问题描述】:

我有一个格式如下的 PHP 数组:

array (size=2)
  '2019-09-28' => 
    array (size=2)
      'A' => float 4
      'B' => float 85
      'C' => float 200
  '2019-09-29' => 
    array (size=2)
      'A' => float 5
      'B' => float 83
      'C' => float 202

我正在尝试使用 PHP 中的 array_walk() 函数来重新排列数组键,如下所示:

array (size=3)
  'A' => 
    array (size=2)
      '2019-09-28' => float 4
      '2019-09-29' => float 5
  'B' => 
    array (size=2)
      '2019-09-28' => float 85
      '2019-09-29' => float 83
  'C' => 
    array (size=2)
      '2019-09-28' => float 200
      '2019-09-29' => float 202

我正在使用以下代码:

$result_arr = [];   
array_walk($myArray,function($v,$k) use (&$result_arr){
  $result_arr[key($v)][$k] = $v[key($v)];
});

但是我当前使用的这段代码只生成第一个项目 A,并且不生成以下项目 B 和 C。即我期望完整的输出,但只收到如下第一项:

array (size=1)
 'A' => 
   array (size=2)
    '2019-09-28' => float 4
    '2019-09-29' => float 5

请帮忙。我错过了什么?

【问题讨论】:

    标签: php arrays array-walk


    【解决方案1】:

    你也需要在那里申请forach()

    $result_arr = [];   
    array_walk($myArray,function($value,$key) use (&$result_arr){
        foreach($value as $k=> $val){ //$value is an array, so iterate over it
             $result_arr[$k][$key] = $val;
        }
    
    });
    
    print_r($result_arr);
    

    输出:https://3v4l.org/fJJhm

    【讨论】:

      【解决方案2】:

      foreach 解决方案,小提琴here

      $array = [
        '2019-09-28' => [
          'A' => 4,
          'B' => 85,
          'C' => 200,
        ],
       '2019-09-29' => [
          'A' => 5,
          'B' => 83,
          'C' => 202,
        ]
      ];
      
      $res = [];
      foreach ($array as $key => $item) {
          foreach ($item as $itemKey => $itemValue) {
              $res[$itemKey][$key] = $itemValue;
          }
      }
      print_r($res);
      

      【讨论】:

        【解决方案3】:

        你可以这样处理

         array_walk($a, function($v,$k) use (&$r){
            array_walk($v,function($v1,$k1) use (&$r,$k){
            $r[$k1][$k] = $v1;
          });
        });
        print_r($r);
        

        工作示例:https://3v4l.org/An23C

        【讨论】:

          【解决方案4】:

          我认为array_walk 最适合用于修改数组中的值,而不是弄乱数组的结构。我个人会使用array_reduce 来聚合给定数组的信息,以形成另一个具有完全不同结构的数组(即您的用例)

          <?php
          
          $array = [
                  '2019-09-28' => [
                          'A' => (float) 4,
                          'B' => (float) 85,
                          'C' => (float) 200,
                  ],
                  '2019-09-29' => [
                          'A' => (float) 5,
                          'B' => (float) 83,
                          'C' => (float) 202,
                  ],
          ];
          
          $result = array_reduce(array_keys($array), function ($result, $date) use ($array) {
                  return array_reduce(array_keys($array[$date]), function ($result, $key) use ($array, $date) {
                          $result[$key][$date] = $array[$date][$key];
                          return $result;
                  }, $result);
          }, []);
          
          var_dump($result);
          

          PHP Sandbox 中演示。

          【讨论】:

            猜你喜欢
            • 2012-01-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-23
            相关资源
            最近更新 更多