2009-08-12 8 views
43

Tôi không thể tìm cách dễ dàng cho phép tạo tệp mới, coi nó là tệp ini (không phải tệp php.ini hoặc simiilar ... một tệp ini riêng cho mỗi người dùng), và tạo/xóa các giá trị bằng cách sử dụng PHP. PHP dường như không cung cấp cách thức dễ dàng để tạo một tệp ini và đọc/ghi/xóa các giá trị. Cho đến nay, tất cả chỉ là "đọc" - không có gì về việc tạo các mục nhập hoặc thao tác các khóa/giá trị.tạo tập tin ini, viết các giá trị trong PHP

+1

khi bạn nói "cho mỗi người dùng", ý của bạn là gì? Mỗi lần sử dụng ứng dụng PHP? –

+1

tại sao bạn cần tệp .ini cho mỗi người dùng? không nên loại thông tin được lưu trữ trong một DB? – Omnipresent

+0

tốt, tôi có nghĩa là tôi muốn một tập tin ini cho mỗi người dùng của cùng một ứng dụng PHP. Ví dụ: chad.ini, jeff.ini, mary.ini, anne.ini – netrox

Trả lời

51

Tìm thấy sau đoạn mã từ ý kiến ​​của các tài liệu 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; 
} 

Cách sử dụng:

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

Chúc may mắn!

+10

Sau 'if (! Fwrite ($ handle, $ content)) {', cần xử lý tập tin. –

+5

Ngoài ra có lỗi trong mã khi không sử dụng các phần, biến $ key2 phải là $ key – kjetilh

+0

Đây không phải là giải pháp chính thức chỉ cách nhận xét của bạn không phải là nhận xét chính thức về tràn ngăn xếp. –

7

Tôi không thể xác minh hiệu quả hoạt động của nó, nhưng có một số đề xuất để thực hiện đối diện parse_ini_file() (ví dụ: write_ini_file, không phải là chức năng PHP chuẩn) trên trang tài liệu cho parse_ini_file.

Bạn có thể sử dụng write_ini_file để gửi các giá trị vào một tập tin, parse_ini_file để đọc chúng trở lại trong - sửa đổi các mảng kết rằng parse_ini_file lợi nhuận, và sau đó viết mảng sửa đổi lại các tập tin với write_ini_file.

Điều đó có phù hợp với bạn không?

5

trong phần mã này:

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

$ khóa2 phải được thay thế bằng $ key hoặc bạn sẽ tìm thấy chìa khóa trống trong .ini

+0

+1, Vâng, bạn là đúng –

8

PEAR của bạn có hai (đơn vị được kiểm tra) các gói mà làm công việc bạn đang khao khát:

  • Config_Lite - lý tưởng nếu bạn chỉ muốn .ini file
  • Config - cũng đọc .php.xml tệp

Tôi muốn sử dụng mã được thử nghiệm tốt hơn là viết của riêng tôi.

+0

1 cho thử nghiệm/giải pháp hỗ trợ –

2

tôi sử dụng này và nó dường như làm việc

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

nó trả về văn bản để viết thư cho một tập tin .ini

+2

đoạn của bạn thất bại nếu $ array_name chứa một mảng đa chiều bên trong. Nghĩa là, nếu mảng mẹ có độ sâu từ 3 trở lên. – Tivie

3

dựa trên các câu trả lời ở trên tôi đã viết lớp này có thể hữu ích. Đối với PHP 5.3 nhưng có thể dễ dàng điều chỉnh cho các phiên bản trước.

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