在集合中添加缺失的数据行-无法解释的Laravel行为

问题描述

我有一个数据表,我需要从中获取一个数组,看起来像这样:

[
   ['Mon',25],['Tue',13],['Thu',25]
]

我正在通过一些杂技表演来实现这一目标。在某个时候,我正在映射集合,其中添加了当天(1月1日,星期二,2周二)的数值作为键,因此以后可以sortKeys()

问题并不总是存在着所有的日子,我想在它们各自的位置将它们添加为0。

我的第一次尝试是foreach在一周的某几天,如果 $collection->flatten()->search($day)返回false,在那天之前。这可以正常工作,但是 Thu 总是会附加。即使复制和粘贴,它也永远不会在搜索中返回true,并且应该相同。正确跳过/设置了所有其他日期...

然后我在array_search上尝试了toArray(),并且发生了同样的事情。 Thu永远不会返回true ...

这非常奇怪,基本上Thu == Thu返回false

无论如何,我可以使用array_merge或类似的东西使它变得更好(或使其完全正常工作吗?)。

解决方法

这是一种实现方式。如果您的数据结构最初是不同的,例如使用日期名称/值作为键,而不是将两者都放在子数组中,则可以做得更整洁,但是我将继续讨论原始问题:

$defaultDays = collect([
    ['Mon',0],['Tue',['Wed',['Thu',['Fri',['Sat',['Sun',]);
$days        = [
    ['Mon',25],13],25]
];

// Use $defaultDays to map,as we will need all seven days no matter what.
$days = $defaultDays->map(static function (array $defaultDay) use ($days) {
    // Current match is the default day...
    $match = $defaultDay;
    foreach ($days as $day) {
        if ($day[0] === $defaultDay[0]) {
            $match = $day;
        }
    }

    return $match;
});

这将导致:

Illuminate\Support\Collection {#1388
  #items: array:7 [
    0 => array:2 [
      0 => "Mon"
      1 => 25
    ]
    1 => array:2 [
      0 => "Tue"
      1 => 13
    ]
    2 => array:2 [
      0 => "Wed"
      1 => 0
    ]
    3 => array:2 [
      0 => "Thu"
      1 => 25
    ]
    4 => array:2 [
      0 => "Fri"
      1 => 0
    ]
    5 => array:2 [
      0 => "Sat"
      1 => 0
    ]
    6 => array:2 [
      0 => "Sun"
      1 => 0
    ]
  ]
}