PHP、simplexml 和 foreach
PHP, simplexml and foreach
第一次在这里提问,本人也是菜鸟PHP,简单XML,但决心要学好这个
问题:我的第一个 foreach 工作得很好....
第二个将 publiccss.tpl 复制到两个目录中并忽略其他 2.....
$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>
你编写第二个循环的方式是回到文档的根目录,而 SimpleXML 不知道你想要哪个 templategroup
,所以它假设你只想要第一个:
$xml->templategroup->template
等同于:
$xml->templategroup[0]->template
您想从外循环遍历 current templategroup
中的所有 template
元素,您称之为 $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){
第一次在这里提问,本人也是菜鸟PHP,简单XML,但决心要学好这个
问题:我的第一个 foreach 工作得很好....
第二个将 publiccss.tpl 复制到两个目录中并忽略其他 2.....
$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>
你编写第二个循环的方式是回到文档的根目录,而 SimpleXML 不知道你想要哪个 templategroup
,所以它假设你只想要第一个:
$xml->templategroup->template
等同于:
$xml->templategroup[0]->template
您想从外循环遍历 current templategroup
中的所有 template
元素,您称之为 $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){