2013-05-08 50 views
0

我已经写了应该创建一个数组,看起来像这样的小脚本:意外的通知:未定义指数当空

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

你得到的基本思想:主数组中的索引是几个月(数字),每个月举行一个动态填充数组。 month键取决于用户请求的语言,工资和奖金分配了工资和/或奖金支付的日期。到目前为止没有任何意外。

要获得阵列的基本结构,我认为这将是最简单的:

我则补之数组,事情顺利进行都是一样的,正确的,直到我想要的地步将数据写入到一个文件,我做到了,像这样:

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为null引发通知行:“警告:未定义指数工资”。目前,我已经把它添加到代码:

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

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

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

+0

即使我为“salary”和“month”属性指定了一些虚拟值,您的示例代码仍然适用于我。我想知道是否在调用'writeFile()'之前调用'array_fill_with_keys()'没有执行。你可以在'foreach'之前添加'var_dump($ this-> months);'并且共享结果吗? – 2013-05-08 03:40:46

+0

@GeorgeHodgson:当然,它是在循环之前执行的:它在构造函数中。这样,我有一个索引为1-12的空数组,每个索引都拥有一个索引为'month','salary'和'bonus'的数组,它们都被初始化为'null'。换句话说,索引不存在是不可能的,但是,该通知另有说明。 – 2013-05-08 03:43:01

+1

你的帖子只显示了赋值给'$ this-> months',我不知道它是在构造函数中。我现在更加好奇看到var_dump($ this-> months)的结果;' – 2013-05-08 04:11:25

回答

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社区。我会删除这个问题,但如果没有人反对,我想我可以把它作为我愚蠢的证据。

0

我不知道,但尝试使用

$this->months = array_fill(1,12, array('month' => null, 
                'salary' => null, 
                'bonus' => null)); 
+0

第一个参数应该是一个数组,然而'range( n,m)'是不是 – DonCallisto 2013-05-08 06:47:22

+0

@DonCallisto,它是'array_fill'而不是'array_fill_keys' – Amir 2013-05-08 06:49:55

+0

你说得对,对不起。顺便说一句,这不应该改变的事情 – DonCallisto 2013-05-08 06:50:46