不能使用字符串offset作为数组



错误信息

错误:不能使用字符串offset作为数组
文件:C: wamp www模型 itsm app TaskAttribute.php
线:48

错误行数

47    foreach($items as $row){
48          $categoryId = $row['Category']['id'];
49          $item_id =  $row['Item']['id'];
50          $attr_id = $row['Attribute']['id'];
<标题> 我的方法
public function getTree($branch_id = NULL){
        $tree = array();
        $items =  $this->find('list',array(
            'fields' => array('ItemAttribute.item_id','ItemAttribute.item_id'),
            'joins' =>array(
                        array(
                            'table' => 'item_attributes',
                            'alias' => 'ItemAttribute',
                            'type' => 'INNER',
                            'conditions' => 'TaskAttribute.item_attribute_id = ItemAttribute.id',
                         ),                 

                ),
                'recursive'=>-1
            )
        );  

        if(isset($items)){
            $assets = $this->Checklist->ChecklistAttribute->AssetAttribute->Asset->getList($branch_id ,array_keys($items));
            //pr($assets);die();
        }
        foreach($items as $row){
            $categoryId = $row['Category']['id'];
            $item_id =  $row['Item']['id'];
            $attr_id = $row['Attribute']['id'];
            if(!isset($tree[$categoryId])){
                $tree[$categoryId] = array('id'=>$categoryId ,'name'=>$row['Category']['name'] ,'Items'=>array());
            }

            $attrib = array('id'=>$row['Attribute']['id'] ,'name'=>$row['Attribute']['name'],'type'=>$row['Attribute']['type']);
            if(isset($items[$item_id])){
                if($asset = ifExist($assets ,$item_id)){
                    if(!isset($tree[$categoryId]['Items'][$item_id])){
                        $tree[$categoryId]['Items'][$item_id]  = array('id'=>$item_id ,'name'=>$row['Item']['model']);
                    }                       
                    if(!isset($tree[$categoryId]['Items'][$item_id]['Assets'])){
                        $tree[$categoryId]['Items'][$item_id]['Assets'] = array('id'=>$asset['id'] ,'name'=>$asset['serial'] ,'Attributes'=>array());
                    }
                    if(!isset($tree[$categoryId]['Items'][$item_id]['Assets']['Attributes'][$attr_id])){
                        $tree[$categoryId]['Items'][$item_id]['Assets']['Attributes'][$attr_id] = $attrib;
                    }
                    if($option_id = ifExist($row ,'AttributeOptions' ,'id')){
                        if(!isset($tree[$categoryId]['Items'][$item_id]['Assets']['Attributes'][$attr_id]['options'])){
                            $tree[$categoryId]['Items'][$item_id]['Assets']['Attributes'][$attr_id]['options'] = array();
                        }
                        $tree[$categoryId]['Items'][$item_id]['Assets']['Attributes'][$attr_id]['options'][$option_id] = $row['AttributeOptions']['label'];
                    }
                }
            }else{
                if(!isset($tree[$categoryId]['Items'][$item_id])){
                    $tree[$categoryId]['Items'][$item_id]  = array('id'=>$item_id ,'name'=>$row['Item']['model'] ,'Attributes'=>array());
                }           
                if(!isset($tree[$categoryId]['Items'][$item_id]['Attributes'][$attr_id])){
                    $tree[$categoryId]['Items'][$item_id]['Attributes'][$attr_id] = $attrib;
                }       
                if($option_id = ifExist($row ,'AttributeOptions' ,'id')){   
                    if(!isset($tree[$categoryId]['Items'][$item_id]['Assets']['Attributes'][$attr_id]['options'])){
                        $tree[$categoryId]['Items'][$item_id]['Attributes'][$attr_id]['options'] = array();
                    }
                    $tree[$categoryId]['Items'][$item_id]['Attributes'][$attr_id]['options'][$option_id] = $row['AttributeOptions']['label'];
                }
            }

        }
            if(isset($tree)){
                foreach($tree as $key=>$items){
                    if(!ifExist($items ,'Items')){
                    unset($tree[$key]);
                }
            }
            return $tree;
        }
    }   

查找列表返回列表

问题中的代码:

$items =  $this->find('list',array(
    'fields' => array('key field','value field')
    ...
));

返回一个平面列表——即$items的结构为:

array(
    'key' => 'value string',
    'key2' => 'value string2',
);

因此,尝试将'value string'视为数组将导致错误。

foreach($items as $item_id => $item_id) {
    //                        ^ It's a string
    // So this won't work:
    // $categoryId = $item_id['Category']['id'];
    $categoryId = ...; // not in the results
    $item_id =  ...; // it's the key and the value returned by find list
    $attr_id = // not in the results

如上所述,代码试图获得的3位信息中有2位根本不在结果中。

使用find all返回一个数组

最简单的解决方法就是调用find all:

$items =  $this->find('all',array(
    //'fields' => array('key field','value field')
    ...
));
debug($items);
die;

仅限制验证所有所需数据都存在后返回的字段。

最新更新