PHP - 数组到 XML 组合项目



我有这个PHP数组,我已经成功地转换为XML,每一行Project都有一个ID ExternalProjectID,有些行具有相同的ID,每个Project都有一个ProjectFloorPlan我试图将所有ProjectFloorPlan合并到一个Project中,而不是双Project项目, 只需一个Project,根据ExternalProjectID将多个ProjectFloorPlan合并为一个Project

下面是 PHP 数组:

[0] => Array
        (
            [ExternalProjectID] => 66
            [ProjectName] => Astoria
            [Address] => 123 Fake Street 
            [City] => Toronto
            [Province] => ON
            [Latitude] => 43.0000
            [Longitude] =>  -79.0000
            [Website] => http://www.website.com/our-communities.php?newcommunity=66
            [ContactPhone] => 555-5555
            [ContactEmail] => email@email.com
            [SalesOfficeAddress] => 123 Fake Street 
            [SalesOfficeCity] => Toronto
            [SalesOfficeProvince] => ON
            [ExternalProjectFloorPlanID] => 2036
            [FloorPlanName] => The Paisley
            [Beds] => 3
            [Baths] => 2.5
            [InteriorSqFtRange] => 1784
            [Price] => 481900
        )
    [1] => Array
        (
            [ExternalProjectID] => 66
            [ProjectName] => Astoria
            [Address] => 123 Fake Street 
            [City] => Toronto
            [Province] => ON
            [Latitude] => 43.0000
            [Longitude] =>  -79.0000
            [Website] => http://www.website.com/our-communities.php?newcommunity=66
            [ContactPhone] => 555-5555
            [ContactEmail] => email@email.com
            [SalesOfficeAddress] => 123 Fake Street 
            [SalesOfficeCity] => Toronto
            [SalesOfficeProvince] => ON
            [ExternalProjectFloorPlanID] => 2037
            [FloorPlanName] => The Chino
            [Beds] => 3
            [Baths] => 2.5
            [InteriorSqFtRange] => 1698
            [Price] => 472900
        )

以下是要转换为 XML 的 PHP 代码:

$newArray = array();
$locationKeys = array('Address', 'City', 'Province', 'Latitude', 'Longitude');
$contactKeys = array('ContactPhone', 'ContactEmail', 'SalesOfficeAddress', 'SalesOfficeCity', 'SalesOfficeProvince');
$projectFloorPlans = array('ExternalProjectFloorPlanID', 'FloorPlanName', 'Beds', 'Baths', 'InteriorSqFtRange', 'Price');
foreach($communitiesArray as $projects) {
    foreach($projects as $key => $value) {
        if(in_array($key, $locationKeys)) {
                $project['Location'][$key] = $value;
        } else if(in_array($key, $contactKeys)) {
                $project['ContactInformation'][$key] = $value;
        } else if(in_array($key, $projectFloorPlans)) {
                $project['ProjectFloorPlans']['ProjectFloorPlan'][$key] = $value;
        } else {
                $project[$key] = $value;
        }
    }
    $newArray[] = $project;
}
$xml_data = new SimpleXMLElement();
function array_to_xml( $data, &$xml_data ) {
    foreach( $data as $key => $value ) {
        if( is_array($value) ) {
            if( is_numeric($key) ){
                $key = 'Project'; //dealing with <0/>..<n/> issues
            }
            $subnode = $xml_data->addChild($key);
            array_to_xml($value, $subnode);
        } else {
            $xml_data->addChild("$key",htmlspecialchars("$value"));
        }
     }
}
$node = $xml_data->addChild('Projects');
array_to_xml($newArray,$node);
echo $xml_data->asXML();

下面是输出 XML:

<Project>
         <ExternalProjectID>66</ExternalProjectID>
         <ProjectName>Astoria</ProjectName>
         <Location>
            <Address>123 Fake Street</Address>
            <City>Toronto</City>
            <Province>ON</Province>
            <Latitude>43.0000</Latitude>
            <Longitude>-79.0000</Longitude>
         </Location>
         <Website>http://www.website.com/our-communities.php?newcommunity=66</Website>
         <ContactInformation>
            <ContactPhone>555-5555</ContactPhone>
            <ContactEmail>email@email.com</ContactEmail>
            <SalesOfficeAddress>123 Fake Street</SalesOfficeAddress>
            <SalesOfficeCity>Toronto</SalesOfficeCity>
            <SalesOfficeProvince>ON</SalesOfficeProvince>
         </ContactInformation>
         <ProjectFloorPlans>
            <ProjectFloorPlan>
               <ExternalProjectFloorPlanID>2036</ExternalProjectFloorPlanID>
               <FloorPlanName>The Paisley</FloorPlanName>
               <Beds>3</Beds>
               <Baths>2.5</Baths>
               <InteriorSqFtRange>1784</InteriorSqFtRange>
               <Price>481900</Price>
            </ProjectFloorPlan>
         </ProjectFloorPlans>
      </Project>
      <Project>
         <ExternalProjectID>66</ExternalProjectID>
         <ProjectName>Astoria</ProjectName>
         <Location>
            <Address>123 Fake Street</Address>
            <City>Toronto</City>
            <Province>ON</Province>
            <Latitude>43.0000</Latitude>
            <Longitude>-79.0000</Longitude>
         </Location>
         <Website>http://www.website.com/our-communities.php?newcommunity=66</Website>
         <ContactInformation>
            <ContactPhone>555-5555</ContactPhone>
            <ContactEmail>email@email.com</ContactEmail>
            <SalesOfficeAddress>123 Fake Street</SalesOfficeAddress>
            <SalesOfficeCity>Toronto</SalesOfficeCity>
            <SalesOfficeProvince>ON</SalesOfficeProvince>
         </ContactInformation>
         <ProjectFloorPlans>
            <ProjectFloorPlan>
               <ExternalProjectFloorPlanID>2037</ExternalProjectFloorPlanID>
               <FloorPlanName>The Chino</FloorPlanName>
               <Beds>3</Beds>
               <Baths>2.5</Baths>
               <InteriorSqFtRange>1698</InteriorSqFtRange>
               <Price>472900</Price>
            </ProjectFloorPlan>
         </ProjectFloorPlans>
      </Project>

任何帮助将不胜感激

它应该可以工作:

// sort projects by ExternalProjectID
usort($communitiesArray, function($first, $second) {
    $firstProjectID = $first['ExternalProjectID'];
    $secondProjectID = $second['ExternalProjectID'];
    return $firstProjectID - $secondProjectID;
});
function processProject($project, &$result) {
    $locationKeys = array('Address', 'City', 'Province', 'Latitude', 'Longitude');
    $contactKeys = array('ContactPhone', 'ContactEmail', 'SalesOfficeAddress', 'SalesOfficeCity', 'SalesOfficeProvince');
    $projectFloorPlans = array('ExternalProjectFloorPlanID', 'FloorPlanName', 'Beds', 'Baths', 'InteriorSqFtRange', 'Price');
    $newProjectID = $project['ExternalProjectID'];
    // compare current project with a previous one
    // if the previous has the same projectId, add projectFloorPlan to the previous
    // if the previous has different projectId, create new object
    if (empty($result) ||
        $result[sizeof($result) - 1]['ExternalProjectID'] !== $newProjectID) {
        $newProject = array('ProjectFloorPlans' => array());
        foreach($project as $key => $value) {
            if (in_array($key, $locationKeys)) {
                $newProject['Location'][$key] = $value;
            }
            else if (in_array($key, $contactKeys)) {
                $newProject['ContactInformation'][$key] = $value;
            }
            else if (!in_array($key, $projectFloorPlans)) {
                $newProject[$key] = $value;
            }
        }
        $result[] = &$newProject;
    }
    else {
        $newProject = &$result[sizeof($result) - 1];
    }
    $projectFloorPlan = array();
    foreach(array_intersect(array_keys($project), $projectFloorPlans) as $key) {
        $projectFloorPlan[$key] = $project[$key];
    }
    if (!empty($projectFloorPlan)) {
        $newProject['ProjectFloorPlans'][] = $projectFloorPlan;
    }
}
$newArray = array();
foreach($communitiesArray as $project) {
    processProject($project, $newArray);
}
$xml_data = new SimpleXMLElement('<Projects/>');
function array_to_xml( $data, &$xml_data) {
    foreach( $data as $key => $value ) {
        if( is_array($value) ) {
            if( is_numeric($key) ){
                $key = $xml_data->getName() === 'Projects' ? 'Project' : 'ProjectFloorPlan'; //dealing with <0/>..<n/> issues
            }
            $subnode = $xml_data->addChild($key);
            array_to_xml($value, $subnode);
        } else {
            $xml_data->addChild($key,htmlspecialchars($value));
        }
    }
}
array_to_xml($newArray,$xml_data);
echo $xml_data->asXML();

最新更新