2009-08-12 10 views
43

No encuentro una manera que me permita crear un archivo nuevo, trátelo como un archivo ini (no php.ini o similar ... un archivo ini separado por usuario), y crear/borrar valores usando PHP. PHP parece no ofrecer una manera fácil de crear un archivo ini y leer/escribir/borrar valores. Hasta ahora, todo es solo "leer", nada sobre crear entradas o manipular claves/valores.crear archivo ini, escribir valores en PHP

+1

cuando dices "por usuario", ¿qué quieres decir? Por uso de la aplicación PHP? –

+1

¿por qué necesita un archivo .ini por usuario? ¿No debería almacenarse ese tipo de información en un DB? – Omnipresent

+0

bueno, quise decir que quiero un conjunto de archivos ini para cada usuario de la misma aplicación PHP. Por ejemplo, chad.ini, jeff.ini, mary.ini, anne.ini – netrox

Respuesta

51

Encontrado siguiente fragmento de código a partir de los comentarios de la documentación de 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; 
} 

Uso:

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

Buena suerte!

+10

Después de 'if (! Fwrite ($ handle, $ content)) {', el identificador del archivo debe cerrarse. –

+5

También hay un error en el código cuando no se utilizan las secciones, la variable $ key2 debe ser $ key – kjetilh

+0

Esta no es una solución oficial de cómo su comentario no es un comentario oficial de desbordamiento de pila. –

7

no puedo dar fe de lo bien que funciona, pero hay algunas sugerencias para la implementación de lo contrario de parse_ini_file() (es decir write_ini_file, que no es una función estándar de PHP) en la página de documentación para parse_ini_file.

Puede utilizar write_ini_file para enviar los valores a un archivo, parse_ini_file para leer de nuevo en - modificar la matriz asociativa que parse_ini_file devoluciones, y luego escribir la matriz modificada de nuevo al archivo con write_ini_file.

¿Eso funciona para usted?

5

en esta porción de código:

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

$ clave2 debe ser reemplazada por la tecla $ o encontraría teclas de vacío en su ini

+0

+1, Sí, tiene razón –

8

PERA tiene dos (unidad de prueba) paquetes que hacen el tarea que anhela:

  • Config_Lite - ideal si solo deseas .ini archivos
  • Config - lee también .php.xml y archivos

prefiero usar un código bien probado que escribir mi propia.

+0

+1 para la solución probada/compatible –

2

utilizo esto y parece que funciona

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

devuelve el texto a escribir en un archivo .ini

+2

Su fragmento falla si $ array_name contiene una matriz multidimensional dentro. Es decir, si la matriz principal tiene una profundidad de 3 o más. – Tivie

3

basado en las respuestas anteriores escribí esta clase que pueda ser útil. Para PHP 5.3, pero se puede adaptar fácilmente para las versiones anteriores.

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