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){