2009-08-12 78 views
43

我無法找到一種輕鬆創建新文件的方式,將它視爲一個ini文件(不是php.ini或類似的...爲每個用戶提供一個單獨的ini文件),並使用PHP創建/刪除值。 PHP似乎沒有提供創建ini文件和讀取/寫入/刪除值的簡單方法。到目前爲止,這只是「閱讀」 - 沒有關於創建條目或操作鍵/值。創建ini文件,在PHP中寫入值

+1

,你是什麼意思?每次使用PHP應用程序? – 2009-08-12 20:02:43

+1

爲什麼你需要每個用戶的.ini文件?不應該將這種類型的信息存儲在數據庫中? – Omnipresent 2009-08-12 20:09:23

+0

好吧,我的意思是我想爲同一個PHP應用程序的每個用戶設置一個ini文件。例如,chad.ini,jeff.ini,mary.ini,anne.ini – netrox 2009-08-12 20:10:55

回答

51

發現以下從PHP文件的註釋代碼片段:

function write_ini_file($assoc_arr, $path, $has_sections=FALSE) { 
    $content = ""; 
    if ($has_sections) { 
     foreach ($assoc_arr as $key=>$elem) { 
      $content .= "[".$key."]\n"; 
      foreach ($elem as $key2=>$elem2) { 
       if(is_array($elem2)) 
       { 
        for($i=0;$i<count($elem2);$i++) 
        { 
         $content .= $key2."[] = \"".$elem2[$i]."\"\n"; 
        } 
       } 
       else if($elem2=="") $content .= $key2." = \n"; 
       else $content .= $key2." = \"".$elem2."\"\n"; 
      } 
     } 
    } 
    else { 
     foreach ($assoc_arr as $key=>$elem) { 
      if(is_array($elem)) 
      { 
       for($i=0;$i<count($elem);$i++) 
       { 
        $content .= $key."[] = \"".$elem[$i]."\"\n"; 
       } 
      } 
      else if($elem=="") $content .= $key." = \n"; 
      else $content .= $key." = \"".$elem."\"\n"; 
     } 
    } 

    if (!$handle = fopen($path, 'w')) { 
     return false; 
    } 

    $success = fwrite($handle, $content); 
    fclose($handle); 

    return $success; 
} 

用法:

$sampleData = array(
       'first' => array(
        'first-1' => 1, 
        'first-2' => 2, 
        'first-3' => 3, 
        'first-4' => 4, 
        'first-5' => 5, 
       ), 
       'second' => array(
        'second-1' => 1, 
        'second-2' => 2, 
        'second-3' => 3, 
        'second-4' => 4, 
        'second-5' => 5, 
       )); 
write_ini_file($sampleData, './data.ini', true); 

祝你好運!

在這個代碼部分
+10

在if(!fwrite($ handle,$ content)){'之後,應該關閉文件句柄。 – 2010-04-11 22:42:33

+5

當不使用分區時,代碼有錯誤,變量$ key2應該是$ key – kjetilh 2012-06-22 11:07:40

+0

這不是官方解決方案,只是您的註釋不是堆棧溢出的正式評論。 – 2013-05-07 20:42:27

7

我不能保證它如何運作,但有實現的parse_ini_file()相反一些建議(即write_ini_file,這是不是一個標準的PHP函數)爲parse_ini_file的文檔頁面上。

您可以使用write_ini_file將值發送到文件,parse_ini_file閱讀它們放回 - 修改關聯數組parse_ini_file回報,然後用write_ini_file寫入修改後的數組回到文件。

這是否適合您?

5

else { 
    foreach ($assoc_arr as $key=>$elem) { 
     if(is_array($elem)) 
     { 
      for($i=0;$i<count($elem);$i++) 
      { 
       $content .= $key2."[] = \"".$elem[$i]."\"\n"; 
      } 
     } 
     else if($elem=="") $content .= $key2." = \n"; 
     else $content .= $key2." = \"".$elem."\"\n"; 
    } 
} 

$ KEY2必須由$鍵所取代,或者你會在你的.ini

+0

+1,是的,你是對的 – 2014-02-09 12:52:14

8

PEAR找到空鍵有兩個(單元測試)包裏面做的任務你是嚮往:

  • Config_Lite - 理想的,如果你只是想.ini文件
  • Config - 也讀.php.xml文件

我寧願使用經過充分測試的代碼比寫我自己。

+0

+1爲測試/支持的解決方案 – 2011-11-11 20:05:30

2

我用這個和它似乎工作

function listINIRecursive($array_name, $indent = 0) 
{ 
    global $str; 
    foreach ($array_name as $k => $v) 
    { 
     if (is_array($v)) 
     { 
      for ($i=0; $i < $indent * 5; $i++){ $str.= " "; } 
      $str.= " [$k] \r\n"; 
      listINIRecursive($v, $indent + 1); 
     } 
      else 
     { 
      for ($i=0; $i < $indent * 5; $i++){ $str.= " "; } 
      $str.= "$k = $v \r\n"; 
     } 
    } 
} 

返回寫入基於上述答案的.ini文件

+2

如果$ array_name裏面包含一個多維數組,你的代碼段將失敗。也就是說,如果父數組的深度爲3或更大。 – Tivie 2012-03-02 00:20:50

3

我寫了這個類,可能是有用的文本。對於PHP 5.3,但可以輕鬆適應以前的版本。

當你「每用戶」說
class Utils 
    { 
     public static function write_ini_file($assoc_arr, $path, $has_sections) 
     { 
      $content = ''; 

      if (!$handle = fopen($path, 'w')) 
       return FALSE; 

      self::_write_ini_file_r($content, $assoc_arr, $has_sections); 

      if (!fwrite($handle, $content)) 
       return FALSE; 

      fclose($handle); 
      return TRUE; 
     } 

     private static function _write_ini_file_r(&$content, $assoc_arr, $has_sections) 
     { 
      foreach ($assoc_arr as $key => $val) { 
       if (is_array($val)) { 
        if($has_sections) { 
         $content .= "[$key]\n"; 
         self::_write_ini_file_r(&$content, $val, false); 
        } else { 
         foreach($val as $iKey => $iVal) { 
          if (is_int($iKey)) 
           $content .= $key ."[] = $iVal\n"; 
          else 
           $content .= $key ."[$iKey] = $iVal\n"; 
         } 
        } 
       } else { 
        $content .= "$key = $val\n"; 
       } 
      } 
     } 
    }