数组键部分重复,排序和除以

时间:2013-11-26 11:53:53

标签: php arrays

我有一个数组

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);
    }
}

1 个答案:

答案 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);
    }
}