2012-06-11 2 views
1

Мне нужна помощь, хотя я думаю, что я проверяю длину массива, и я должен выйти из цикла, я все равно получаю предупреждения на своем [еще если ($ значение ....] линия. Так что либо я что-то не хватает важно или я смотрел на этот сегмент кода слишком долго, и его очевидное. Любое понимание будет оценено.Получение неопределенного смещения в моем массиве PHP в то время как в foreach

$count = count($filter); //Filter is an array 
    if ($count > 1){ 
     //Compare values and generate a range to choose from 
     $i = 1; 
     foreach($filter as $value){ 
      //Break the loop if at the end of the array 
      if ($i >= $count){ 
       //throw new exception($i .' '.$count); 
       break; 
      } 
      //if the value is smaller then the next procceding value, because they are already in order of presidence, 
      //add it to our range of potentials. 
      else if($value < $filter[$i]->value){ 
       array_push($range, key($filter)); 
      } 
     $i++; 
     }   
    }else { 
     return false; 
    } 
+0

Показать выход 'var_dump ($ фильтра);'. Если в вашем массиве есть пробелы или если это ассоциативный массив (строковые индексы), это произойдет. – Travesty3

+0

Какое предупреждение вы получаете на 'else if ($ value ...'? –

+0

Примечание: Неопределенное смещение: 1 в // файле yadada // строка # - но ответы были правильными. Мои ключи не являются последовательными, derp Спасибо, ребята. – dbergunder

ответ

1

Я подозреваю, что есть пробелы в вашем массиве Попробуйте это:.

$filter = array_values($filter); // this will remove any gaps in the array 
$count = count($filter); 
if ($count <= 1) 
    return false; 

for ($i = 0; $i < $count; $i++) 
{ 
    if ($i != $count-1 && $filter[$i]->value < $filter[$i+1]->value) 
     array_push($range, key($filter)); 
} 
+0

Спасибо, я должен был знать лучше. – dbergunder

0

попробовать этот код .... нет необходимости проверять счет ..

$range = array(); 
$i = 1; 
foreach($filter as $value) 
{ 
    if(isset($filter[$i]) && $value < $filter[$i]->value) 
    { 
     array_push($range, key($filter)); 
     $i++; 
    } 
    else 
    { 
     break; 
    } 
} 
+0

Мне нравится этот ответ, но мой момент derp был отмечен ранее, поэтому, спасибо. – dbergunder

+0

Если вы не проверите count, то на последней итерации, вы будете сравнивать последнюю запись в массиве с неопределенным индексом массива. Вот почему в его примере он проверяет 'if ($ i> = $ count) {break;}'. – Travesty3

1

В вашем массиве могут быть нечисловые ключи. Тогда попробуйте это:

foreach($filter as $key=>$value) 
{ 
    // test for $filter[$key]; 
} 

Или ваш массив $ фильтр не имеет объектов, то вы не можете использовать -> в

$filter[$key]->value 
Смежные вопросы