2009-08-12 15 views
43

में मान लिखें, मुझे कोई तरीका नहीं मिल रहा है जो आसानी से मुझे एक नई फाइल बनाने देता है, इसे एक आईएनआई फ़ाइल के रूप में मानता है (php.ini या simiilar ... प्रति उपयोगकर्ता के लिए एक अलग आईएनआई फ़ाइल नहीं), और PHP का उपयोग कर मान बनाएं/हटाएं। PHP एक आईएनआई फ़ाइल बनाने और मूल्यों को पढ़ने/लिखने/हटाने के लिए कोई आसान तरीका प्रदान नहीं करता है। अभी तक, यह सब सिर्फ "पढ़ा" है - प्रविष्टियां बनाने या कुंजियों/मानों को जोड़ना के बारे में कुछ भी नहीं।आईएनआई फ़ाइल बनाएं, PHP

+1

जब आप "प्रति उपयोगकर्ता" कहते हैं, तो आपका क्या मतलब है? PHP आवेदन के प्रति उपयोग? –

+1

आपको प्रति उपयोगकर्ता .ini फ़ाइल की आवश्यकता क्यों है? क्या उस प्रकार की जानकारी डीबी में संग्रहित नहीं होनी चाहिए? – Omnipresent

+0

अच्छी तरह से, मेरा मतलब था कि मैं एक ही PHP अनुप्रयोग के प्रत्येक उपयोगकर्ता के लिए एक आईएनआई फ़ाइल सेट चाहता हूं। उदाहरण के लिए, chad.ini, jeff.ini, mary.ini, anne.ini – netrox

उत्तर

51

पीएचपी दस्तावेज की टिप्पणियों से कोड स्निपेट निम्नलिखित मिला:

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 ($ हैंडल, $ सामग्री)) {', फ़ाइल हैंडल बंद होना चाहिए। –

+5

अनुभागों का उपयोग न करने पर कोड में भी एक त्रुटि है, परिवर्तनीय $ key2 $ key – kjetilh

+0

होना चाहिए यह एक आधिकारिक समाधान नहीं है कि आपकी टिप्पणी स्टैक ओवरफ़्लो की आधिकारिक टिप्पणी नहीं है। –

7

मैं इसे कैसे अच्छी तरह से काम समर्थन नहीं कर सकता है, लेकिन वहाँ parse_ini_file() के विपरीत लागू करने के लिए कुछ सुझाव है (अर्थात write_ini_file है, जो एक मानक PHP समारोह नहीं है) parse_ini_file के लिए दस्तावेज़ पृष्ठ पर।

आप parse_ini_file एक फ़ाइल से मान भेजने का उन्हें वापस पढ़ने के लिए write_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"; 
    } 
} 

$ कुंजी 2 $ कुंजी द्वारा प्रतिस्थापित किया जाना चाहिए या आप अपने .ini

+0

+1, हां, आप सही/समर्थित समाधान –

8

नाशपाती में खाली चाबियाँ मिलेगा दो (इकाई का परीक्षण) संकुल जो करना है कार्य आप कर रहे हैं लालसा के लिए:

  • Config_Lite - आदर्श यदि आप केवल चाहते .ini फ़ाइलों
  • Config - भी .php और .xml फ़ाइलों

पढ़ता है मैं नहीं बल्कि अपने ही लिखने की तुलना में अच्छी तरह से परीक्षण किया कोड का उपयोग करेंगे।

+0

+1 सही हैं 0 स्निपेट विफल रहता है यदि $ array_name में बहु-आयामी सरणी है। यही है, अगर अभिभावक सरणी की गहराई 3 या अधिक है। –

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

के लिए – Tivie

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"; 
       } 
      } 
     } 
    } 
संबंधित मुद्दे