cakeHP阵列结构


cakePHP Array structure

我正在尝试使用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()提供的参数无效"错误。

如果有人能勾勒出所需的正确阵列结构,我将不胜感激。

正如IsisCode所说,将问题与PHPExcel联系起来,听起来你看错了方向。这个错误通常只是说提供给foreach()的第一个参数不是数组。

不过,我没有看到任何迹象表明问题明确存在于_headers()方法中的初始foreach。如果$this->数据中有一个非数组元素,那么您的_rows()方法也可能产生错误。

给定:

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

例如,这将导致_rows()中的第二个foreach失败。你的错误消息应该能够指出哪个foreach()失败了,但最终听起来你在$this->数据中有一个非数组元素,这是你没有预料到的。如果这无济于事,那么在调用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++; 
    } 

在将变量交给特定类型的函数之前验证变量的类型从来都不是一个坏主意,而且通常可以省去很多麻烦。