我有一个数组
Array
(
[database_db_host] => localhost
[database_db_user] => root
[database_db_pass] => qwerty
[database_db_db] => db
[system_base] => http://www.mysite.com/
[system_DEBUG_MODE] => 0
[system_name] => mysite.com
[system_VAT] => 20
[appearance_copyright] => 2012 - 2013
[appearance_DEFAULT_LANG] => 2
[appearance_MULTI_CR_LEVELS] => 0
[appearance_SEARCH_RESULTS_PER_PAGE] => 20
[appearance_width] => 970
[ads_ADS_ENABLED] => 1
[ads_ADS_impression_cost] => 0.001
[ads_ADS_min_auditory] => 100
)
我需要使用这些前缀来覆盖当前存在的配置文件,我的问题是我不知道如何有效地执行此操作。我能想到的唯一方法是循环遍历数组以根据前缀创建新数组,然后循环所有数组以从中获取值并再次循环以保存到文件中,这看起来不像是一种优雅的方式去做这个。必须有一个更简单的方法。
if($_SERVER['REQUEST_METHOD']=='POST'){
$prefixes = array();
foreach($_POST as $key => $value){
$prefixes[] = substr($key,0,strpos($key,'_'));
}
$prefixes = array_unique($prefixes);
$ini_strings = array();
foreach($prefixes as $prefix){
$ini_strings[$prefix] = '';
foreach($_POST as $setting => $value){
if(strpos($setting,$prefix)===0){
$quot = (is_numeric($value) ? '' : '"');
$ini_strings[$prefix] .= str_replace($prefix.'_','',$setting).' = '.$quot.$value.$quot.PHP_EOL;
}
}
}
foreach($ini_strings as $ini => $settings){
file_put_contents(phppages.'config/'.$ini.'.ini',$settings);
}
}
答案 0 :(得分:1)
这个怎么样?两个循环,但更清晰的代码...如果你真的想要你可以在1循环中完成整个事情但是你必须不止一次写入每个文件,我真的不喜欢这样做。
if($_SERVER['REQUEST_METHOD'] == 'POST') {
$ini_strings = array();
foreach($_POST as $key => $setting_value) {
$parts = explode('_', $key);
$prefix = array_shift($parts); // shift the first element off the array
$setting_name = implode('_', $parts); // ...and put the rest back together
/* at this point:
$prefix is the prefix, e.g. ads
$setting_name is the setting name e.g. ADS_min_auditory,
$setting_value is the value e.g. 100
*/
if (!array_key_exists($prefix, $ini_strings))
$ini_strings[$prefix] = "";
$quot = is_numeric($setting_value) ? '' : '"';
$ini_strings[$prefix] .= $setting_name . ' = ' . $quot . $setting_value . $quot . PHP_EOL;
}
foreach($ini_strings as $ini => $settings) {
file_put_contents(phppages . 'config/' . $ini . '.ini', $settings);
}
}