这是我第一次在这里提问,而且我也是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>
答案 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){