【问题标题】:How to add missing keys to array如何将缺少的键添加到数组
【发布时间】:2021-12-29 14:51:41
【问题描述】:

我有一个数组,每次都需要包含相同的数据键,是否可以在给定以下数组的情况下添加设置为 0 的缺失键?

我正试图接受它并制作这个:

[
  {
    "name": "7:00 AM",
    "data": [
      {
        "x": "2019",
        "y": 1
      },
      {
        "x": "2020", // Added
        "y": 0       // Added
      },
      {
        "x": "2021", // Added
        "y": 0       // Added
      }
    ]
  },
  {
    "name": "8:00 AM",
    "data": [
      {
        "x": "2019",
        "y": 69
      },
      {
        "x": "2020",
        "y": 4
      },
      {
        "x": "2021",
        "y": 221
      }
    ]
  },
  {
    "name": "9:00 AM",
    "data": [
      {
        "x": "2019",
        "y": 6
      },
      {
        "x": "2020",
        "y": 2
      },
      {
        "x": "2021", // Added
        "y": 0       // Added
      }
    ]
  }
]

所以基本上最长的data 数组在8:00 AM 时隙中,我正在尝试将那些丢失的数据点添加到其他时隙中,默认值为0

编辑:这是我必须生成的第一个数组:

我正在使用 Laravel 并使用以下内容查询数据库:

$shipments = Orders::whereNotNull('shipped_at')->groupBy(DB::raw('YEAR(created_at)'))->selectRaw('count(*) as count, HOUR(shipped_at) as hour')->selectRaw("DATE_FORMAT(created_at, '%Y') label")->orderBy('label')->orderBy('hour')->groupBy('hour')->get();

然后我像这样格式化数组,只是不确定如何添加那些丢失的键:

$shipping_chart_year = [];
foreach ($shipments as $item) {
    $hour = Carbon::parse($item['hour'] . ':00:00')->timezone('America/Chicago')->format('g:i A');
    $shipping_chart_year[] = ['name' => $hour, 'data' => [['x' => $item['label'], 'y' => $item['count']]]];
}

$shipping_chart_year = collect($shipping_chart_year)
    ->groupBy('name')
    ->transform(function ($items, $name) {
        // Merge nested arrays into one
        $data = $items->map(function ($item) {
            return $item['data'][0];
        })->toArray();

        return [
            'name' => $name,
            'data' => $data,
        ];
    })
    ->values() 
    ->toArray();

【问题讨论】:

  • 你的函数/循环在哪里?我们看到了您的预期结果,但您尝试了什么?
  • @Zak 用当前代码更新了我的问题以生成原始数组。

标签: php arrays laravel


【解决方案1】:
function getAllYears(array $array): array
{
    $allKeys = [];
    foreach ($array as $data) {
        foreach ($data['data'] as $years) {
            if (!in_array($years['x'], $allKeys, true)) {
                $allKeys[] = $years['x'];
            }
        }
    }
    sort($allKeys);
    return $allKeys;
}

function addMissingKeys(array $array): array
{
    $allYears = getAllYears($array);
    foreach ($array as $key => $data) {
        $currentYears = array_map(static function ($year) {
            return $year['x'];
        }, $data['data']);
        $yearToAdd = array_diff($allYears, $currentYears);
        foreach ($yearToAdd as $year) {
            $array[$key]['data'][] = [
                'x' => $year,
                'y' => 0,
            ];
        }
    }
    return $array;
}

$array = [
    [
        "name" => "7:00 AM",
        "data" => [
            [
                "x" => "2019",
                "y" => 1
            ]
        ]
    ],
    [
        "name" => "8:00 AM",
        "data" => [
            [
                "x" => "2019",
                "y" => 69
            ],
            [
                "x" => "2020",
                "y" => 4
            ],
            [
                "x" => "2021",
                "y" => 221
            ]
        ]
    ],
    [
        "name" => "9:00 AM",
        "data" => [
            [
                "x" => "2019",
                "y" => 6
            ],
            [
                "x" => "2020",
                "y" => 2
            ]
        ]
    ]
];

$array = addMissingKeys($array);

var_dump($array);

您可以在此处查看此代码的结果:https://sandbox.onlinephpfunctions.com/code/2c58df4749126199bf21357d1c615634a0ebd629

【讨论】:

  • 谢谢,成功了!
猜你喜欢
  • 2019-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
相关资源
最近更新 更多