0

我写了一个小脚本,它应该创建一个看起来像这样的数组:

array(1 => array( 'month'  => 'Jan',
                  'salary' => '01/31/2013',
                  'bonus'  => '02/15/2013'),
      2 => array('month' => '',...));

你得到了基本的想法:主数组中的索引是月份(数字),每个月份都有一个要动态填充的数组。month关键取决于用户请求的语言,工资和奖金被分配工资和/或奖金的支付日期。到目前为止还没有惊喜。

要获得该数组的基本结构,我认为这将是最简单的:

$this->months = array_fill_keys(range(1,12), array( 'month' => null,
                                                    'salary' => null,
                                                    'bonus' => null));

然后我填充数组,一切都运行顺利,直到我想将数据写入文件,我这样做了:

private function writeFile()
{
    foreach($this->months as $key => $vals)
    {
        if ($vals['month'] === null)
        {//Only filled from date x to date y, some months can be empty
            continue;
        }
        //this seems to raise notices?
        if ($vals['salary'] === null)
        {
            $vals['salary'] = 'Does not apply';
        }
        fwrite($this->file, implode(',', $vals).PHP_EOL);
    }
    fclose($this->file);
    return $this;
}

我检查是否salary为空的行会引发通知:"Warning: Undefined index salary"。目前我不得不将其添加到代码中:

if (!array_key_exists('salary', $vals) || $vals['salary'] === null)
{
    if (!array_key_exists('bonus', $vals) || $vals['bonus'] === null)
    {
        break;
    }
    $vals['salary'] = 'Does not apply';
}

为了得到我需要的结果。我用谷歌搜索了这个,偶然发现这个错误报告,最后一次修改是在 4 年前(2009-05-08),但状态仍然设​​置为“无反馈”。
有没有其他人遇到过类似的故障/错误?或者我在这里错过了什么?我怎样才能避免这个问题,而不需要太多if的 's 和函数调用而不更改我的设置(E_STRICT | E_ALL应该如此)。

顺便说一句:我在 Slackware 14 上运行 PHP 5.4.7。对于这个小应用程序,我使用了 2 个 Symfony 组件(ClassLoader 和 Console),但由于这是一个与 Symfony 无关的对象的一部分,除了从被加载通过UniversalClassLoader我不认为这是相关的。
由于据说该错误是PDO相关的:是的,我正在使用 PDO,但在另一个类中。

4

2 回答 2

0

我不确定,但尝试使用

$this->months = array_fill(1,12, array( 'month' => null,
                                                    'salary' => null,
                                                    'bonus' => null));
于 2013-05-08T03:46:18.693 回答
0

几秒钟后var_dump,我发现了原因:数组键是range(1,12),以确定我正在处理的月份。为此,我DateTime以下列方式使用了一个对象:

$date->modify('+ '.$diff.' days');
$key = $date->format('m');

问题是format调用返回一个字符串。目标是列出何时支付薪水和奖金。如果 15 日是星期六或星期日,则必须在每 15 日或下一个星期三支付奖金。工资将在每月的最后一天或最后一个星期五支付。
换句话说,奖金支付日期是这样分配的:

$key = $date->format('m');
$this->months[$key]['month'] = $date->format('M');
if ($date->format('d') == 15)
{
    //find find week-day (15th or following Wednesday)
    $this->months[--$key]['bonus'] = $date->format('m/d/Y');
    $key++;
    //set date to end of month
}
//check week-day, and modify date if required
$this->months[$key]['salary'] = $date->format('m/d/Y');

因为$this->months数组的键是数字,但使用的格式$key是 2 位字符串,带有前导零,所以我遇到了问题。
每个月的 15 号,该$key值被强制转换为一个整数(减量/增量运算符),但月份是使用字符串分配的。

我在最初的问题中提供的信息不充分,对此感到抱歉,但我刚刚通宵达旦。最后,修复非常简单:

$key = (int) $date->format('m');//cast

我衷心感谢所有回复,以及为 SO 社区做出贡献的每个人。我会删除这个问题,但如果没有人反对,我想我可能会留下它来证明我的愚蠢。

于 2013-05-09T23:01:40.887 回答