douchang6770
douchang6770
2016-03-10 00:39

php - 用数组创建一个对象

已采纳

I am trying to parse an XML file. I want to create a project object that has instances such as title,date,version and an array of files that hold all the files within the project. Everything seems to work such as the title,date,and version.

I checked by printing them out to see the results. However, when I try printing out the array to see if the contents are correct, nothing happens. I'm not sure where I'm going wrong.

<?php

require_once('project.php');
require_once('files.php');


function parse()
{
    $svn_list = simplexml_load_file("svn_list.xml");
    $dir = $svn_list->xpath("//entry[@kind = 'dir']");


    foreach ($dir as $node) {
        if (strpos($node->name, '/') == false) {

            $endProject = initProject($node);

        }
    }

    for ($x = 0; $x <= 7; $x++) {
        echo $endProject->fileListArray[$x]->name . "<br />
";
    }

}

function initProject($node){

    $project = new project();
    $project->title = $node->name;
    $project->date = $node->commit->date;
    $project->version = $node->commit['revision'];

    initFiles($node,$project);

    return $project;

}

function initFiles($project){

    $svn_list = simplexml_load_file("svn_list.xml");
    $file = $svn_list->xpath("//entry[@kind ='file']/name[contains(., '$project->title')]/ancestor::node()[1]");
    //$file = $svn_list->xpath("//entry[@kind='file']/name[starts-with(., '$project->title')]/..");

    foreach($file as $fileObject){
        $files = new files();
        $files->size = $fileObject->size;
        $files->name = $fileObject->name;
        array_push($project->fileListArray, $files);
    }

}

echo $endProject->fileListArray prints out "Array" 7 times. However echo $endProject->fileListArray[$x]->name does not print anything out.

I'm not sure if the array is just not being initialized or if I'm parsing the XML file incorrectly.

<?xml version="1.0" encoding="UTF-8"?>
<lists>
<list
        path="https://subversion....">
    <entry
            kind="file">
        <name>.project</name>
        <size>373</size>
        <commit
                revision="7052">
            <author></author>
            <date>2016-02-25T20:56:16.138801Z</date>
        </commit>
    </entry>
    <entry
            kind="file">
        <name>.pydevproject</name>
        <size>302</size>
        <commit
                revision="7052">
            <author></author>
            <date>2016-02-25T20:56:16.138801Z</date>
        </commit>
    </entry>
    <entry
            kind="dir">
        <name>Assignment2.0</name>
        <commit
                revision="7054">
            <author></author>
            <date>2016-02-25T20:59:11.144094Z</date>
        </commit>
    </entry>
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • doushouj966020 doushouj966020 5年前

    Your function definition:

    function initFiles( $project )
    

    Your function call:

    initFiles( $node, $project );
    

    So, the function use $node as $project, but $node doesn't have ->fileListArray property array, so your array_push() fails.

    And, in the future, don't forget to activate error checking in our php code:

    error_reporting( E_ALL );
    ini_set( 'display_errors', 1 );
    

    With error checking, your original code output this error:

    PHP Warning: array_push() expects parameter 1 to be array, object given in ...

    点赞 评论 复制链接分享
  • doushen8391 doushen8391 5年前

    By default, function arguments are passed by value which means the value of the argument doesn't get changed outside of the function, unless you pass by reference. The PHP docs have more details but I think if you simply change:

    function initFiles($project){... to function initFiles(&$project){... (note the &), it will work as you expect.

    点赞 评论 复制链接分享