在 PHP 中解析 ini 文件时如何写入数组名称?

How write arrays name while parsing an ini file in PHP?

我正在使用 parse_ini_file 来解析一个使用 PHP 的 ini 文件。

现在我首先将一个 INI 文件上传到我的服务器然后打开它并允许用户对该文件进行自定义更改。

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

这是代码:

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

你之前代码的罪魁祸首是你的数组格式不正确,它应该是数组的数组来实现你想要的。

试试下面的代码:

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

从你之前的代码中,我删除了一些不合适的代码。此外,太多的不一致,如方法命名、变量命名等。

如果您的函数被命名为 Camel cased,那么在您的代码中它必须被命名为 camel-cased。如果您的变量带有下划线,那么在您的代码中,它们必须为两个或多个单词变量添加下划线。

我没有编辑您代码的命名约定,因此您不会感到困惑,但我建议在整个项目中采用一致的命名约定。

更新:

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

$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']);

终于得到答案了:

I will loop through what i get from POST and will get each array's key. And then i will give the resultant to my Write Method

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

        /*Getting the parameters to display on view*/

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




        while (current($this->data['parameters']) ) 
        {
            $param_set = current($this->data['parameters']);
            $param_type = key($this->data['parameters']);

                foreach ($param_set as $key =>$value) 
                {

                    $this->data['parameters'][$param_type][$key] = $this->input->post($key);

                } 

                next($this->data['parameters']);
        }




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

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

        $file = $path.$filename;

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