2013-05-08 53 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