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

问题描述:

我使用parse_ini_file解析使用PHP的ini文件。在PHP中解析ini文件时如何写入数组名称?

现在我第一次上传INI文件到我的服务器,然后打开它,并允许用户MAK来的文件自定义更改。

现在,一旦用户已编辑的文件我收到后的数据,并保存文件发送回服务器。但现在我没有得到我的部分。 INIdetails,更新文件中的Dialplan,所以当我还想写文件如何做到这一点?

这是代码:

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

?这是没有意义的。 'parse_ini_file'的目的是让你从代码中读取ini文件中的结构化数据。而不是相反。 – Sherif

+0

下面的函数写ini文件] – Rajan

+0

我不会混乱的功能做了什么。我的问题是***为什么你使用'parse_ini_file'来写入ini文件?***。这不是'parse_ini_file'的用处。它用于**从** ini文件中**读取**值到** your_code_中,而不是用于**将值写入ini文件。 – Sherif

从以前的代码的罪魁祸首是你的阵列格式不正确,应该是数组的数组实现你想要什么。

试试下面的代码:

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

从以前的代码中,有一堆我删除不得体的代码。此外,像法命名,变量命名等

太多的不一致。如果你的函数被命名为骆驼通过你的代码,然后装箱它必须被命名为骆驼套管。如果你的变量带有下划线,那么通过你的代码,它们必须有两个或更多的措词变量的下划线。

我没有编辑代码的命名约定,这样你就不会被混淆,但我建议要通过你的项目一致的命名约定。

更新:根据您的回答

,好像你改变你的整个代码。我想提供使用嵌套的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']); 
+0

是的,我已经改变了代码,因为我已经检查了多行代码的每个POST值,所以 – Rajan

+0

你能帮我这个:http://*.com/questions/36052603/how-to-create-a-file基于数据库值 – Rajan

+0

请帮我这个:http://*.com/questions/36591037/write-database-values-to-a-ini-file-using-php-codeigniter – Rajan

最后我得到一个答案:

我会通过我从POST得到循环和意志获取每个阵列的密钥。然后,我将你为什么要使用`parse_ini_file`写入ini文件给最终我写方法

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

似乎是这样的是完全不同于你的问题的代码,但我更新了我的答案只是incase你想要另一种方式来实现这一点:)祝你好运队友 – Ceeee

+1

@Ceeee你的代码是正确的,但我只是不想为每个POST值我写得到所以我只是使用循环,非常感谢您的帮助 – Rajan

+0

无后顾之忧。总是在这里帮助:)现在您的代码比以前更好。你是对动态循环而不是逐个编辑它们:) – Ceeee