在PHP中解析ini文件时如何写数组名称? [英] How write arrays name while parsing an ini file in PHP?

查看:69
本文介绍了在PHP中解析ini文件时如何写数组名称?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用parse_ini_file使用PHP解析ini文件.

I am using parse_ini_file to parse an ini file using PHP.

现在,我首先将INI文件上传到服务器,然后将其打开并允许用户对文件进行自定义更改.

Now I first upload an INI file to my server then open it and allow user to mak custom changes to the file.

现在,一旦用户编辑了文件,我就会从帖子中获取数据并将文件保存回服务器.但是,现在我没有我的部分. INIdetails,Dialplan在更新的文件中,所以当我也想将其写入文件时该怎么做?

Now once users has edited the file i get the data from post and save the file back to server. But Now i dont get my sections. INIdetails,Dialplan in the updated file so when i also want to write that to file how to do that?

这是代码:

$this->data['parameters'] = parse_ini_file($path.$filename,true);

    /*Getting Our POST DATA from View*/
        $data = array(
                        'SipUserName' => $this->input->post('SipUserName') , 
                        'SipAuthName' => $this->input->post('SipAuthName'), 
                        'DisplayName' => $this->input->post('DisplayName'),
                        'Password' => $this->input->post('Password'), 
                        'Domain' => $this->input->post('Domain'), 
                        'Proxy' => $this->input->post('Proxy'),
                        'Port' => $this->input->post('Port'), 
                        'ServerMode' => $this->input->post('ServerMode'),
                        'Param_1' => $this->input->post('Param_1'),
                        'Param_2' => $this->input->post('Param_2')
                    );


        /*Creating New file with the name of customer loggedin*/


        $name = $this->session->userdata('username');
        $ext = $this->session->userdata('extension');       
        $custom_file = fopen('uploads/'.$name.'_'.$ext.'.ini', 'w');




        fwrite($custom_file, "[INIDetails]\n");

        foreach ($data as $key => $value) 
        {
            fwrite($custom_file, "    $key = $value\n");
        }



        fclose($custom_file);   

        /*Setting path to New CUSTOM file with customer name as prefix*/
        $file = $path.$custom_file;


        function write_php_ini($array, $file)
        {
            $res = array();
            foreach($array as $key => $val)
            {
                if(is_array($val))
                {
                    $res[] = "[$key]";
                    foreach($val as $skey => $sval) $res[] = "$skey = ".(is_numeric($sval) ? $sval : '"'.$sval.'"');
                }
                else $res[] = "$key = ".(is_numeric($val) ? $val : '"'.$val.'"');
            }
            safefilerewrite($file, implode("\r\n", $res));
        }

        function safefilerewrite($fileName, $dataToSave)
        {    if ($fp = fopen($fileName, 'w'))
            {
                $startTime = microtime(TRUE);
                do
                {            $canWrite = flock($fp, LOCK_EX);
                   // If lock not obtained sleep for 0 - 100 milliseconds, to avoid collision and CPU load
                   if(!$canWrite) usleep(round(rand(0, 100)*1000));
                } while ((!$canWrite)and((microtime(TRUE)-$startTime) < 5));

                //file was locked so now we can store information
                if ($canWrite)
                {            fwrite($fp, $dataToSave);
                    flock($fp, LOCK_UN);
                }
                fclose($fp);
            }

        }

        /*Creates ini file, dumps array to string and creates .INI file*/
        write_php_ini($data,$file);

推荐答案

您之前的代码的罪魁祸首是您的数组格式不正确,它应该是要实现所需内容的数组数组.

The culprit from your previous code is that your array is not formatted correctly, it should be array of arrays to achieve what you want.

尝试以下代码:

// First read the ini file that the user was editing
// Your idea to read the existing ini file is good, since it will generate you the structured array
$previous_data = parse_ini_file($path . $filename, true);

// Overwrite/edit the previous_data using user's post data
$previous_data['INIDetails']['SipUserName'] = $this->input->post('SipUserName');
$previous_data['INIDetails']['Password']    = $this->input->post('Password');
$previous_data['INIDetails']['Domain']      = $this->input->post('Domain');
$previous_data['INIDetails']['Proxy']       = $this->input->post('Proxy');
$previous_data['INIDetails']['Port']        = $this->input->post('Port');
$previous_data['INIDetails']['SipAuthName'] = $this->input->post('SipAuthName');
$previous_data['INIDetails']['DisplayName'] = $this->input->post('DisplayName');
$previous_data['INIDetails']['ServerMode']  = $this->input->post('ServerMode');
$previous_data['INIDetails']['UCServer']    = $this->input->post('UCServer');
$previous_data['INIDetails']['UCUserName']  = $this->input->post('UCUserName');
$previous_data['INIDetails']['UCPassword']  = $this->input->post('UCPassword');

$previous_data['DialPlan']['DP_Exception'] = $this->input->post('DP_Exception');
$previous_data['DialPlan']['DP_Rule1']     = $this->input->post('DP_Rule1');
$previous_data['DialPlan']['DP_Rule2']     = $this->input->post('DP_Rule2');

$previous_data['DialPlan']['OperationMode']   = $this->input->post('OperationMode');
$previous_data['DialPlan']['MutePkey']        = $this->input->post('MutePkey');
$previous_data['DialPlan']['Codec']           = $this->input->post('Codec');
$previous_data['DialPlan']['PTime']           = $this->input->post('PTime');
$previous_data['DialPlan']['AudioMode']       = $this->input->post('AudioMode');
$previous_data['DialPlan']['SoftwareAEC']     = $this->input->post('SoftwareAEC');
$previous_data['DialPlan']['EchoTailLength']  = $this->input->post('EchoTailLength');
$previous_data['DialPlan']['PlaybackBuffer']  = $this->input->post('PlaybackBuffer');
$previous_data['DialPlan']['CaptureBuffer']   = $this->input->post('CaptureBuffer');
$previous_data['DialPlan']['JBPrefetchDelay'] = $this->input->post('JBPrefetchDelay');
$previous_data['DialPlan']['JBMaxDelay']      = $this->input->post('JBMaxDelay');
$previous_data['DialPlan']['SipToS']          = $this->input->post('SipToS');
$previous_data['DialPlan']['RTPToS']          = $this->input->post('RTPToS');
$previous_data['DialPlan']['LogLevel']        = $this->input->post('LogLevel');

// Set Name of New file with the name of customer logged in
$name        = $this->session->userdata('username');
$ext         = $this->session->userdata('extension');
$custom_file = "$name_$ext.ini";
$new_filename        = $path . $custom_file;

// Write the INI file
write_php_ini($data, $new_filename);

function write_php_ini($array, $new_filename)
{
    $res = array();
    foreach ($array as $key => $val) {
        if (is_array($val)) {
            $res[] = "[$key]";
            foreach ($val as $skey => $sval) {
                $res[] = "$skey = " . (is_numeric($sval) ? $sval : '"' . $sval . '"');
            }

        } else {
            $res[] = "$key = " . (is_numeric($val) ? $val : '"' . $val . '"');
        }

    }
    safefilerewrite($new_filename, implode("\r\n", $res));
}

function safefilerewrite($new_filename, $dataToSave)
{
    if ($fp = fopen($new_filename, 'w')) {
        $startTime = microtime(true);
        do {
            $canWrite = flock($fp, LOCK_EX);
            // If lock not obtained sleep for 0 - 100 milliseconds, to avoid collision and CPU load
            if (!$canWrite) {
                usleep(round(rand(0, 100) * 1000));
            }

        } while ((!$canWrite) and ((microtime(true) - $startTime) < 5));

        //file was locked so now we can store information
        if ($canWrite) {
            fwrite($fp, $dataToSave);
            flock($fp, LOCK_UN);
        }
        fclose($fp);
    }
}

从您之前的代码中,我删除了一堆不合适的代码.另外,还有太多的不一致性,例如方法命名,变量命名等.

From your previous code, there are bunch of inappropriate codes which I remove. Also, too many inconsistencies like Method naming, variable naming etc.

如果您的函数命名为Camel cased,则在整个代码中,它必须命名为camel-cased.如果您的变量带有下划线,则在整个代码中,它们必须具有两个或多个措词变量的下划线.

If your function was named Camel cased then through out your code it must be named as camel-cased. If your variables are with underscore, then through out your code, they must have underscore for two or more worded variable.

我没有编辑您的代码的命名约定,所以您不会感到困惑,但是我建议您在整个项目中使用一致的命名约定.

I didn't edit the naming convention of your code so you won't be confused but i suggest to have a consistent naming convention through out your project.

已更新:

根据您的答案,似乎您更改了整个代码.我想提供另一种使用嵌套的foreach并通过引用传递以节省几行的方法:

based on your answer, it seems like you changed your whole code. I would like to provide another way using nested foreach and passing by reference that save couple of lines:

$this->data['params'] = $this->parameter_m->get();

$this->data['parameters'] = parse_ini_file($path . $filename, true);

foreach ($this->data['parameters'] as $key_header => &$value_header) {
    foreach ($value_header as $key_item => &$value_item) {
        $value_item = $this->input->post($key_item);
    }
}

$this->load->helper('file');

$this->load->library('ini');

$file = $path . $filename;

$ini = new INI($file);
$ini->read($file);
$ini->write($file, $this->data['parameters']);

这篇关于在PHP中解析ini文件时如何写数组名称?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆