2013-05-08 2 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 является недействительным поднимает уведомления: «Предупреждение: Undefined индекс зарплаты». На данный момент я должен был добавить это к коду:

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

Чтобы добраться до результата, мне нужно. Я сделал это в googled и наткнулся на this bug report, который был последний раз изменен 4 года назад (2009-05-08), но статус по-прежнему установлен на «без обратной связи».
Кто-нибудь еще сталкивался с подобным сбоем/ошибкой? Или я чего-то не хватает? Как я могу избежать этой проблемы без необходимости слишком большого количества вызовов if и функций без, меняя свои настройки (E_STRICT | E_ALL, как и должно быть).

BTW: Я использую PHP 5.4.7 на Slackware 14. Для этого небольшого приложения я использую 2 компонента Symfony (ClassLoader и Console), но так как это часть объекта, который не имеет ничего общего с Symfony, кроме загрузки через UniversalClassLoader Я не думаю, что это актуально.
Поскольку ошибка называется PDO связанной: да, я использую PDO, но в другом классе.

+0

Ваш примерный код выполнен для меня хорошо, даже после того, как я присвоил некоторые фиктивные значения свойствам «зарплата» и «месяц». Интересно, не вызывается вызов 'array_fill_with_keys()' до вызова 'writeFile()'. Можете ли вы добавить 'var_dump ($ this-> months);' перед 'foreach' и поделиться результатами? –

+0

@GeorgeHodgson: Ну, конечно, он выполняется до цикла: он находится в конструкторе. Таким образом, у меня есть пустой массив с индексами 1-12, каждый из которых содержит массив с индексами «месяц», «зарплата» и «бонус», которые все инициализируются «null». Другими словами, невозможно, чтобы индекс _not_ существовал, однако в уведомлении говорится иначе. –

+1

Ваше сообщение только показывало задание '$ this-> months', я не знал, что это было в конструкторе. Мне теперь еще любопытно увидеть результат «var_dump ($ this-> months);' –

ответ

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-цифровая строка а, с ведущими нулями, я возникли проблемы.
Каждое пятно месяца значение $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

+0

@DonCallisto, это' array_fill' не 'array_fill_keys' – Amir

+0

Вы правы, извините. Кстати, это не должно меняться – DonCallisto

Смежные вопросы