Laravel在模型上循环并更改为数组

时间:2014-08-06 15:06:38

标签: php arrays laravel laravel-4

我正在尝试将我的模型更改为xml格式。

我做了几乎所有事情,但我仍然需要这件事:

$data = [
            'domain'=> $xmlDocument->domain,
            'FirstDate' => $xmlDocument->dateAttribute->first_date,
            'LastDate' => $xmlDocument->dateAttribute->last_date,
            'Category' => $xmlDocument->category->name,
            'Action' => $xmlDocument->websiteAction->name,
            'Source' => $xmlDocument->source->name,
            'LogFile' => $xmlDocument->log_file,
            'DateAttribute' => [
                        'Name' => $xmlDocument->dateAttribute->name,
                        'Place' => $xmlDocument->dateAttribute->dateLocation->name,
                        'DateFunction' => $xmlDocument->dateAttribute->dateFunction->name
                    ],
            'MasterPage' => [
                'MasterAttributes' => [

                ],
                'Container'=>[
                    'xpath' => $xmlDocument->masterInformation->xpath
                ],
                'NextPage' =>[],
                'LinkAttribute'=>[]
            ],
        ];

如您所见,MasterAttributes为空。

模型$xmlDocument具有这样的一对多关系:

$xmlDocument->masterInformaton->masterAttributes

masterAttributes是很多部分

我的问题

如何使用那么多并将其传递给数组,因此该数组中的每个元素都是:

'masterAttribute' => [
    'name' => ...,
    'xpath' => ...
]

换句话说,我将有许多数组,这些数组将被添加到我向你展示的代码中的 MasterAttribute键。

我希望我能指出你,如果没有,请告诉我。

更新

我尝试过:

$masterAttributes = [];
        foreach ($xmlDocument->masterInformation->masterAttributes as $attribute){
            $masterAttribute = [
                'Attribute' =>[
                    'defaultValue' => $attribute->defaultValue,
                    'name' => $attribute->attributeName->name,
                    'xpath' => $attribute->xpath
                ]
            ];
            array_push($masterAttributes, $masterAttribute);
        }

然后我将结果如下:

'MasterAttributes' => [
                    $masterAttributes
                ],

但生成的xml是:

<MasterAttributes>
         <item0>
            <item0>
               <Attribute>
                  <defaultValue />
                  <name>bathroom</name>
                  <xpath>this is the xpath</xpath>
               </Attribute>
            </item0>
            <item1>
               <Attribute>
                  <defaultValue />
                  <name>price</name>
                  <xpath>new xpath</xpath>
               </Attribute>
            </item1>
            <item2>
               <Attribute>
                  <defaultValue />
                  <name>bathroom</name>
                  <xpath>new xpath value</xpath>
               </Attribute>
            </item2>
         </item0>
      </MasterAttributes>

看一下我不想要的额外Item2item0

更新2

生成xml的代码是:

$xml = new SimpleXMLElement("<?xml version=\"1.0\"?><websiteInformation></websiteInformation>");
        $this->array_to_xml($data,$xml);
        $xml->asXML("FileName".XmlDocument::find($id)->id.".xml");

其中$data是我向您展示的最终数组,而array_to_xml是:

// function defination to convert array to xml
    public  function array_to_xml($student_info, &$xml_student_info) {
        foreach($student_info as $key => $value) {
            if(is_array($value)) {
                if(!is_numeric($key)){
                    $subnode = $xml_student_info->addChild("$key");
                    $this->array_to_xml($value, $subnode);
                }
                else{
                    $subnode = $xml_student_info->addChild("item$key");
                    $this->array_to_xml($value, $subnode);
                }
            }
            else {
                $xml_student_info->addChild("$key",htmlspecialchars("$value"));
            }
        }
    }

Updadte 3

@watcher给了我一个aswer,这是他/她回答的结果

<MasterAttributes>
         <item0>
            <masterAttribute>
               <name />
               <xpath>this is the xpath</xpath>
            </masterAttribute>
         </item0>
         <item1>
            <masterAttribute>
               <name />
               <xpath>new xpath</xpath>
            </masterAttribute>
         </item1>
         <item2>
            <masterAttribute>
               <name />
               <xpath>new xpath value</xpath>
            </masterAttribute>
         </item2>
      </MasterAttributes>

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

$attributes = $xmlDocument->masterInformaton->masterAttributes;
foreach($attributes as $attribute) {
    $data['MasterPage']['MasterAttributes'][] = [
        'masterAttribute' => [
            'name' => $attribute->name,
            'xpath' => $attribute->xpath,
        ]
    ];
}

这假设主要属性的属性为namexpath

<强>更新

$subnode = $xml_student_info->addChild("item$key");

这是xml生成中添加item0个节点的行。删除它无济于事,因为您确实需要根据这些索引构建子树,但您不希望将它们直接添加到XML文档中。

我尝试了一个快速的解决方案,但事实证明它并不那么快(我也发现我认为你找到xml代码here的原始答案)。

更新2

尝试将此用于xml生成,看看它是否能满足您的需求。它基于this answer @drzaus:

function simple_xmlify($arr, SimpleXMLElement $root = null, $el = 'x') {
    // based on, among others https://stackoverflow.com/a/1397164/1037948

    if(!isset($root) || null == $root) $root = new SimpleXMLElement('<' . $el . '/>');

    if(is_array($arr)) {
        foreach($arr as $k => $v) {
            // special: attributes
            if(is_string($k) && $k[0] == '@') $root->addAttribute(substr($k, 1),$v);
            // normal: append
            else {
                if(is_numeric($k) && is_array($v)) {
                    foreach($v as $ik => $iv) {
                        simple_xmlify($iv, $root);
                    }
                } else {
                    simple_xmlify($v, $root->addChild(
                        // fix 'invalid xml name' by prefixing numeric keys
                        is_numeric($k) ? 'n' . $k : $k)
                    );
                }

            }
        }
    } else {
        $root[0] = $arr;
    }

    return $root;
}//--   fn  simple_xmlify