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

Adding missing rows of data in a collection - unexplanable Laravel behavior

我有一个 table 数据,我需要从中获取一个数组,如下所示:

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

我正在通过一些收集杂技来实现这一目标。在某些时候,我正在映射集合,添加那天(1 个星期一,2 个星期二)的数值作为键,这样我可以稍后 sortKeys()

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

我的第一次尝试是 foreach 一周中的几天,如果 $collection->flatten()->search($day) returns false,把那一天放在前面。这工作正常,但 Thu 总是被追加。它在搜索中永远不会 returns 正确,即使它被复制和粘贴并且应该是相同的。所有其他日子都是 skipped/prepended 正确...

然后我在 toArray() 上尝试了 array_search,同样的事情发生了。 Thu 永远不会 returns 正确 ...

这太奇怪了,基本上Thu == Thu returns false

有没有我可以使用 array_merge 或类似的东西来让它变得更好(或者让它正常工作?)。

这是一种方法。如果您的数据首先结构不同,比如使用 day name/value 作为键,而不是将两者都放在子数组中,那么它可以做得更干净,但我会保留原来的问题:

$defaultDays = collect([
    ['Mon', 0],
    ['Tue', 0],
    ['Wed', 0],
    ['Thu', 0],
    ['Fri', 0],
    ['Sat', 0],
    ['Sun', 0],
]);
$days        = [
    ['Mon', 25],
    ['Tue', 13],
    ['Thu', 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
    ]
  ]
}