2012-02-15 21 views
0

PHPExcel 1.7.6を使用してMS Excelスプレッドシートを生成しようとしています。予想される配列の構造を決定するのに問題があります。私は現在、「foreachのために供給無効な引数()」はエラーを取得しています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()に渡される最初の引数が配列ではないということだけです。

問題が_headers()メソッドの最初のforeachで明示的であることを示すものは表示されません。 $ this-> dataに配列以外の要素がある場合、_rows()メソッドもエラーを生成する可能性があります。

を考える:_rowsにおける第二のforeachを引き起こす

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

は()の例として、失敗します。あなたのエラーメッセージは、foreach()が失敗している場所を指すことができるはずですが、最終的に$ this-> dataに配列以外の要素があるように思えます。それが助けすることができない場合は、呼び出すforeachの前に、配列を扱っているの検証を検討:悪い考えになることはありません

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++; 
    } 

型固有の関数に渡す前に、変数の型を確認し、一般的な頭痛の多くを保存することができます。