PHP,simplexml和foreach

时间:2015-04-19 19:56:33

标签: php foreach simplexml

这是我第一次在这里提问,而且我也是PHP和简单XML的新手,但我决心要学习这个。

问题:我的第一个foreach工作坊....

第二个人将publiccss.tpl拖入两个dirs而忽略了另外两个......

    $xml = simplexml_load_file($target_path);
if($xml['product'] == 'style'){
$sname =                                 str_replace(' ','_',$xml['sname']);
$vers = $xml['version'];
$sp = 'library/templates/'.$sname;
if($i = mysql_query("INSERT INTO skins VALUES ('". mysql_insert_id() ."','". str_replace('_',' ',$sname) ."','". $vers ."','".$sp."')")){
if(!is_dir($sp)) mkdir($sp,0777);
foreach($xml->templategroup as $dir){
$dir = str_replace(' ','_',$dir['name']);
$p = 'library/templates/'.$sname.'/'.$dir;
if(!is_dir($p)) mkdir($p,0777);
foreach($xml->templategroup->template as $tpl){
$p = 'library/templates/'.$sname.'/'.$dir.'/'.str_replace(' ','_',$tpl['name']);            
$fp = fopen($p,"wb");
fwrite($fp,$tpl);
fclose($fp);
}
}
}else{
echo mysql_error();
}
}else{
echo 'Not a style';
}
}


<?xml version="1.0" encoding="ISO-8859-1"?>

<style sname="DSkin" version="1.0.0" product="style">
<templategroup name="CSS Templates">
<template name="PublicCSS.tpl" date="" username="Andy?">
#body{}
</template>
</templategroup>
<templategroup name="Forum Home">
<template name="Forumhome.tpl" date="" username="Andy?">
Main index page.
</template>
<template name="Forumhome_L.tpl" date="" username="Andy?">
Level one forums.       
</template>

</templategroup>
</style>    $xml = simplexml_load_file($target_path);
if($xml['product'] == 'style'){
$sname =                                 str_replace(' ','_',$xml['sname']);
$vers = $xml['version'];
$sp = 'library/templates/'.$sname;
if($i = mysql_query("INSERT INTO skins VALUES ('". mysql_insert_id() ."','". str_replace('_',' ',$sname) ."','". $vers ."','".$sp."')")){
if(!is_dir($sp)) mkdir($sp,0777);
foreach($xml->templategroup as $dir){
$dir = str_replace(' ','_',$dir['name']);
$p = 'library/templates/'.$sname.'/'.$dir;
if(!is_dir($p)) mkdir($p,0777);
foreach($xml->templategroup->template as $tpl){
$p = 'library/templates/'.$sname.'/'.$dir.'/'.str_replace(' ','_',$tpl['name']);            
$fp = fopen($p,"wb");
fwrite($fp,$tpl);
fclose($fp);
}
}
}else{
echo mysql_error();
}
}else{
echo 'Not a style';
}
}


<?xml version="1.0" encoding="ISO-8859-1"?>

<style sname="DSkin" version="1.0.0" product="style">
<templategroup name="CSS Templates">
<template name="PublicCSS.tpl" date="" username="Andy?">
#body{}
</template>
</templategroup>
<templategroup name="Forum Home">
<template name="Forumhome.tpl" date="" username="Andy?">
Main index page.
</template>
<template name="Forumhome_L.tpl" date="" username="Andy?">
Level one forums.       
</template>

</templategroup>
</style>

1 个答案:

答案 0 :(得分:0)

你编写第二个循环的方式是回到文档的根目录,而SimpleXML并不知道你想要哪个templategroup,所以它假设你只想要第一个:

$xml->templategroup->template

与:

相同
$xml->templategroup[0]->template

您希望从外部循环(您称之为template)遍历当前 templategroup中的所有$dir元素,因此你真正想要的应该是这个:

foreach($dir->template as $tpl){

但是,您要进一步覆盖变量$dir,使用以下行:

$dir = str_replace(' ','_',$dir['name']);

将这个变量用于两个不同的目的通常是一个坏主意,在这种情况下,$dir对于第一个目的来说并不是一个好名字,所以我建议你将其更改为:

foreach($xml->templategroup as $templategroup){

$dir = str_replace(' ','_',$templategroup['name']);

给你一个内循环:

foreach($templategroup->template as $tpl){