2012-02-15 2 views
0

Я пытаюсь сгенерировать лист распространения MS Excel с использованием PHPExcel 1.7.6. У меня возникли проблемы с определением структуры ожидаемого массива.Структура массива PHP

Код, который создает столбцы и строки следующим образом:

function _headers() { 
     $i=0; 
     foreach ($this->data[0] as $field => $value) { 
      if (!in_array($field,$this->blacklist)) { 
       $columnName = Inflector::humanize($field); 
       $this->sheet->setCellValueByColumnAndRow($i++, 4, $columnName); 
      } 
     } 
     $this->sheet->getStyle('A4')->getFont()->setBold(true); 
     $this->sheet->getStyle('A4')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID); 
     $this->sheet->getStyle('A4')->getFill()->getStartColor()->setRGB('969696'); 
     $this->sheet->duplicateStyle($this->sheet->getStyle('A4'), 'B4:'.$this->sheet->getHighestColumn().'4'); 
     for ($j=1; $j<$i; $j++) { 
      $this->sheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($j))->setAutoSize(true); 
     } 
    } 

    function _rows() { 
     $i=5; 
     foreach ($this->data as $row) { 
      $j=0; 
      foreach ($row as $field => $value) { 
       if(!in_array($field,$this->blacklist)) { 
        $this->sheet->setCellValueByColumnAndRow($j++,$i, $value); 
       } 
      } 
      $i++; 
     } 
    } 

В настоящее время я получаю «Недействительного аргумента для Еогеаспа()» ошибки.

Буду признателен, если кто-то может наметить правильную структуру массива.

+1

Ваше сообщение об ошибке предполагает, что $ this-> data [0] не является массивом, начните отладку, попробовав print_r ($ this-> data [0]) – IsisCode

ответ

1

Как сказал IsisCode, похоже, что вы смотрите в неправильном направлении, связав проблему с PHPExcel. Эта ошибка, как правило, просто говорит о том, что первый аргумент, предоставленный foreach(), не является массивом.

Я не вижу ничего, что указывает на то, что проблема явно связана с начальным foreach в методе _headers(). Если в $ this-> data есть элемент без массива, то ваш метод _rows() также может вызвать ошибку.

Дано:

$this->data = Array( 
    Array('foo' => 'bar'), 
    'baz' 
) 

Это вызовет второй Еогеасп в _rows() на провал, в качестве примера. Ваше сообщение об ошибке должно указывать на то, к какому foreach() не удается, но в конечном итоге это звучит так, будто у вас есть элемент без массива в $ this-> data, где вы этого не ожидаете. Если это не помогло, а затем рассмотреть вопрос проверки вы имеете дело с массивом перед вызовом Еогеасп:

function _rows() { 
    $i=5; 
    foreach ($this->data as $row) { 
     $j=0; 
     if(!is_array($row)) { continue; } // Ignore non-array elements 
     foreach ($row as $field => $value) { 
      if(!in_array($field,$this->blacklist)) { 
       $this->sheet->setCellValueByColumnAndRow($j++,$i, $value); 
      } 
     } 
     $i++; 
    } 

Проверка типа переменной перед передачей его функции типоспецифичной никогда не плохая идея, и может сэкономить много головной боли в целом.

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