如何解决将元素推入缺少月份的数组
我想用零填充数组中缺失的月份。
输入数据:
$d = [
[
'type' => 25500,'month' => 'July'
],[
'type' => 5465,'month' => 'January'
],[
'type' => 40000,'month' => 'April'
],[
'type' => 35000,'month' => 'June'
],[
'type' => 10000,'month' => 'February'
]
];
$allmonths = ['January','February','march','April','May','June','July','August','September','October','November','December'];
我的代码:
$res = [];
foreach ($allmonths as $key => $mes) {
$teste = array_search($mes,array_column($d,'month'));
if ($teste) {
$res[$teste] = ['type' => 2,'moth '=> $mes];
} else {
$res[] = ['type' => 0,'moth '=> $mes];
}
}
我一直在尝试解决这个问题,但没有成功。
预期结果:
Array
(
[0] => Array
(
[type] => 25500
[month] => July
)
[1] => Array
(
[type] => 5465
[month] => January
)
[2] => Array
(
[type] => 40000
[month] => April
)
[3] => Array
(
[type] => 35000
[month] => June
)
[4] => Array
(
[type] => 10000
[month] => February
)
[5] => Array
(
[type] => 0
[month] => march
)
[6] => Array
(
[type] => 0
[month] => May
)
[7] => Array
(
[type] => 0
[month] => August
)
[8] => Array
(
[type] => 0
[month] => September
)
[9] => Array
(
[type] => 0
[month] => October
)
[10] => Array
(
[type] => 0
[month] => November
)
[11] => Array
(
[type] => 0
[month] => December
)
)
解决方法
我会带array_column()、array_diff()和一个foreach()
过程:
1)创建所有月份的数组
2) 使用 array_column()
获取数组中存在的所有月份。
3) 使用 array_diff()
查找数组中不可用的月份。
4) 迭代这个差异并将它们添加到您当前的数组中。
$allMonths = ['January','February','March','April','May','June','July','August','September','October','November','December'];
$currentMonths = array_column($d,'month');
$notIncludedMonth = array_diff($allMonths,$currentMonths);
foreach ($notIncludedMonth as $month) {
$d[] = [
'type' => 0,'month' => $month,];
}
print_r($d);
,
这样的事情可以工作:
<?php
$d = [
[
'type' => 25500,'month' => 'July'
],[
'type' => 5465,'month' => 'January'
],[
'type' => 40000,'month' => 'April'
],[
'type' => 35000,'month' => 'June'
],[
'type' => 10000,'month' => 'February'
]
];
$allmonths = ['January','December'];
$present_months = array_column($d,'month');
foreach ($allmonths as $month) {
if (!in_array($month,$present_months)) {
$d[] = [
'type' => 0,];
}
}
var_dump($d);
,
由于这里的目标是将缺失的月份附加到原始数组 $d
而不更改现有的 elements
(根据预期结果),我们可以简单地更改 $d
而不是创建一个新变量 $res
。
同时转换数组 $d
的键将使它更容易使用。这确实假设 month
在 $d
中只出现一次。
## Assumption: Month is unique
$dNew = array_column($d,null,'month');
$res = [];
foreach ($allmonths as $key => $mes) {
if (!isset($dNew[$mes])) {
$d[] = ['type' => 0,'moth ' => $mes];
}
}
var_dump($d);
如果 month
在数组中不是唯一的,您可以使用 array_search
或 in_array
来获得类似的结果。
$dNew = array_column($d,'month');
$res = [];
foreach ($allmonths as $key => $mes) {
if (!array_search($mes,$dNew)) {
$d[] = ['type' => 0,'moth ' => $mes];
}
}
print_r($d);
,
这个答案需要付出额外的努力来安排几个月的时间(不是你要求的——这对我来说是正确的)。
此外,效率可能不是这项任务的重点,但为了研究人员的利益,我将表示 in_array()
、array_search()
、array_diff()
和任何其他“价值比较" 技术不能像 array_key_exists()
、isset()
、??
(空合并运算符)、array_diff_key()
等“关键比较”技术那样有效地工作。为此原因,我喜欢努力的第一个片段 - !isset()
将在循环中表现得很好。
这是我的替代方案,它不进行迭代函数调用(但会迭代整个月份数组)。 (Demo)
$lookup = array_column($d,'month'); // assign temporary keys for improved efficiency
$result = [];
foreach ($allmonths as $month) {
$result[] = $lookup[$month] ?? ['type' => 0,'month' => $month];
}
var_export($result);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。