在集合中添加缺失的数据行 - 无法解释的 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
]
]
}
我有一个 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
]
]
}