2012-06-27 2 views
2
$options = array('health', 'strength', 'agility', 'stamina', 'defence'); 

$total = array(); 

foreach ($options as $value) 
{ 
    foreach ($objects as $object) 
    { 
     $total[$value] += $object->$value; 
    } 
} 

var_dump($total); 

У меня есть некоторые объекты в массиве под названием $objects. Это дает данные $total, как и следовало бы.Неопределенное смещение 0, но все равно дает правильный результат

Но по какой-то причине он скулит о некотором неопределенном смещении.

Notice: Undefined index: health in C:\wamp\www\objbattle\index.php on line 32 

Line 32: $total[$value] += $object->$value;

Почему !? И как мне избавиться от него?

ответ

2

Потому что $total['health'] не существует на первой итерации.

0

Я ожидаю, потому что вы пытаетесь, чтобы увеличить маркированного инициализируется значение ...

пытаются назначить на первом круге, а не, как это:

$total[$value] = $object->$value; 

или более просто, инициализирует массив значений ...

$total = array(); 
$total['health'] = 0; 
etc... 

или сделать это как @josmith предлагает в своем ответе

+0

Он перебирает объекты $. Я предполагаю, что он пытается заполнить все значения в каком-то массиве, поэтому он не может просто назначить его, так как он будет переопределен следующей итерацией. – josmith

+0

он может назначить в цикле на первой итерации, проверив, в какую итерацию находится цикл, или за пределами цикла, который он может назначить после объявления переменных. –

+0

Вы отредактировали свое сообщение, то же самое, что и я, его ниспроверг. Теперь, однако, ваш пост не заслуживает ниспроверки, но я не могу его вернуть. – josmith

2

Это потому, что вы пытаетесь увеличить неинициализированное значение. Попробуйте инициализировать их сначала.

$total = array('health' => 0, 'strength' => 0, 'agility' => 0, 'stamina' => 0, 'defence' => 0); 
0

Ключ «здоровье» не существует для первого цикла через каждый. В результате вы получите уведомление.

Вы можете сделать:

$total[$value] = 0; 

Прямо над вторым Еогеаспом.

Или вы могли бы сделать это ленивый путь и подавить УВЕДОМЛЕНИЕ:

error_reporting(E_ALL^~E_NOTICE); 
+0

Не следует поощрять подавлять уведомление. Это не очень хорошая практика :) – josmith

+0

Согласен, но это настройка по умолчанию для сообщений об ошибках на PHP4 и PHP5 –

0

Почему !? Я думаю, потому что устанавливает, какие ошибки PHP сообщаются.

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