首页 > 解决方案 > 将二维数组转换为类似表格的结构

问题描述

我有一个二维数组作为输入。例子:

$input = [
  [1,2,3], 
  [11, "a" => "val_a"],
  [12,'b' => 'val_b', 'a' => 'val2_a'],
  [2 => 22]
];

我想将其转换为具有表格结构的数组。在类表结构中,所有子数组(行)具有完全相同的键,顺序相同。这些键是第二级所有键的并集。

新键:[0, 1, 2, 'a', 'b']

输入数组中不存在的元素接收值 NULL。我期待以下结果:

$expected = [
  [ 0 => 1,  1 => 2,    2 => 3,    'a' => NULL, 'b' => NULL],
  [ 0 => 11, 1 => NULL, 2 => NULL, 'a' => "val_a", 'b' => NULL],
  [ 0 => 12, 1 => NULL, 2 => NULL, 'a' => "val2_a", 'b' => "val_b"],
  [ 0 => NULL, 1 => NULL, 2 => 22, 'a' => NULL, 'b' => NULL]
];

到目前为止我已经尝试过:

function rectify($array){
    $maxRow = [];
    foreach($array as $row){
      $maxRow += $row;
    }
    $new = [];
    foreach($array as $key => $row){
      foreach($maxRow as $mKey => $mVal){
        $new[$key][$mKey] =  array_key_exists($mKey,$row) ? $row[$mKey] : NULL;
      }
    }
    return $new;
  }

该函数提供正确的结果。由于一个查询有 2 个嵌套循环,因此该解决方案非常复杂。另一次尝试返回相同的密钥,但顺序不同。

标签: phpmultidimensional-array

解决方案


此代码首先标识数据中的所有列。然后它创建一个空模板数组(array_unique用于删除重复项)。

然后它再次循环遍历行并用于array_replace填充每一行的值......

$headers = [];
foreach ( $input as $row )  {
    $headers = array_merge($headers, array_keys($row));
}
$headers = array_fill_keys(array_unique($headers), null);
$output = [];
foreach ( $input as $row )  {
    $output[] = array_replace($headers, $row);
}

推荐阅读