2015-04-19 2 views
0

Это мой первый вопрос, задающий вопрос здесь, и я также новичок в PHP и простой XML, но я решил узнать это.PHP, simplexml и foreach

проблема: мой первый Еогеасп работы ФАБ ....

2-й один обманывает на 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> 

ответ

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

Теперь я, м-ки см: Примечание: Попытка получить свойство не-объекта в C: \ XAMPP \ HTDOCS \ chris \ admin.php в строке 66 Предупреждение: недопустимый аргумент, предоставленный foreach() в C: \ xampp \ htdocs \ chris \ admin.php в строке 66 –

+0

@ChrisJamesReynolds Ах, вы перезаписываете переменную '$ dir '; см. отредактированный ответ. Вы должны быть в состоянии работать оттуда - ключ к отладке - это понимание логики. – IMSoP

+0

@MMSoP, и есть гениальный, но это работает. но он все еще обманывает publiccss, почему? –