PHP数组结构

时间:2012-02-15 17:19:10

标签: php cakephp

我正在尝试使用 PHPExcel 1.7.6 生成MS Excel电子表格。我无法确定预期的数组结构。

构建列和行的代码如下:

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

我目前正在为foreach()'错误提供'无效参数。

如果有人能够概述所需的正确数组结构,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

正如IsisCode所说,通过将问题与PHPExcel相关联,听起来你正在寻找错误的方向。该错误通常只是说提供给foreach()的第一个参数不是数组。

虽然我没有看到任何迹象表明问题是使用_headers()方法中的初始foreach显式的。如果$ this-&gt;数据中存在非数组元素,则您的_rows()方法也会产生错误。

假设:

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

这会导致_rows()中的第二个foreach失败,例如。您的错误消息应该能够指向哪个foreach()失败,但最终听起来您在$ this-&gt;数据中有一个非数组元素,而您不期望它。如果这无法帮助,那么在调用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++; 
    } 

在将变量传递给类型特定函数之前验证变量的类型绝不是一个坏主意,并且通常可以节省很多麻烦。