Как использовать функцию PHP array_walk для перестановки ключей в многомерном массиве? - PullRequest
4 голосов
/ 01 октября 2019

У меня есть массив 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

Я пытаюсь использовать функцию array_walk () в PHP для перестановки ключей массива следующим образом:

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 и CIe Iожидайте полного вывода, но получите только первый элемент следующим образом:

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

Пожалуйста, помогите. Чего мне не хватает?

Ответы [ 4 ]

3 голосов
/ 01 октября 2019

foreach решение, скрипка здесь :

$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 голосов
/ 01 октября 2019

Вам нужно подать 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

1 голос
/ 01 октября 2019

Я думаю, 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.

1 голос
/ 01 октября 2019

Вы можете подойти к этому

 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...