微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将元素推入缺少月份的数组

如何解决将元素推入缺少月份的数组

我想用零填充数组中缺失的月份。

输入数据:

$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);

输出:https://3v4l.org/GsFoO

,

这样的事情可以工作:

<?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 中只出现一次。

Link to working example

## 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_searchin_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 举报,一经查实,本站将立刻删除。