2011-05-26 22 views
7

:Bir INI dosyasında aşağıdaki adres

[country] 
SE = Sweden 
NO = Norway 
FI = Finland 

Ancak var_dump() PHP'nin parse_ini_file() fonksiyonunu ing, aşağıdaki çıktıyı almak:

"HAYIR" 'ın rezerve edildiği göründüğü gibi görünür. "NO" adlı bir değişken ayarlayabilmem için başka bir yolu var mı? parse_ini_file için manuel sayfasından

cevap

4

Başka kesmek olur ini anahtarlarınızı değerleriyle tersine çevirip array_flip:

kullanın
<?php 

$ini = 
" 
    [country] 
    Sweden = 'SE' 
    Norway = 'NO' 
    Finland = 'FI' 
"; 

$countries = parse_ini_string($ini, true); 
$countries = array_flip($countries["country"]); 
echo $countries["NO"]; 

Hala NO (en azından) etrafında tırnak kullanmanız gerekecektir, sen

Norway = NO 

yaparsanız $ ülkelerde [ "HAYIR"] şeklinde bir hata ama değer alamadım olacak bir boş dize.

+0

+1 Oh, güzel bir çözüm :-) – lonesomeday

+1

Teşekkürler, muhtemelen bunu yapmanın tek yolu budur. –

+0

Değerleriniz benzersiz değilse, bu kırılma olmaz mıydı? Her şeyden sonra bunlar * değerler *, anahtarlar değil. – Pacerier

-1

:

INI dosyalarında anahtar olarak kullanılmaması gereken rezerve kelime vardır. Bunlar: null, yes, no, true, false, on, off, none.

Hayır, NO değişkenini ayarlayamazsınız.

+1

Bir geçici çözüm istiyor. – Pacerier

2

kesmek Kind kalmayıp önemli isimlerin etrafında komutu ters tırnak ekleyebilirsiniz: Sonra

[country] 
`SE` = Sweden 
`NO` = Norway 
`FI` = Finland 

şöyle bunlara erişmek:

$result = parse_ini_file('test.ini'); 
echo "{$result['`NO`']}\n"; 

Çıktı:

$ php test.php 
Norway 
+1

Bu, değişkeni başka bir şeye yeniden adlandırmaktan başka bir şey değildir. Çözümünüzle, değişken adı NO değil, NO. Yapılandırma dosyasında da 'πNOπ = Norveç' de olabilir. –

0

Bu hatayı, 't veya' gibi dizede tek tırnak işareti kombinasyonları olduğunda aldım.

önce::

You have selected 'Yes' but you haven't entered the date's flexibility 

sonra:

"You have selected 'Yes' but you haven't entered the date's flexibility" 
3

Bu Propably biraz geç geliyor ama işler parse_ini_file yolu PHPs rahatsız sorunun kurtulmak için, ben çift tırnak dize sarılmış bana çok az kendi küçük ayrıştırıcımı yazdım.

Kullanmaktan çekinmeyin, ancak dikkatli kullanın, sadece sığ bir şekilde test edilmiştir!

// the exception used by the parser 
class IniParserException extends \Exception { 

    public function __construct($message, $code = 0, \Exception $previous = null) { 
     parent::__construct($message, $code, $previous); 
    } 

    public function __toString() { 
     return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; 
    } 

} 

// the parser 
function my_parse_ini_file($filename, $processSections = false) { 
    $initext = file_get_contents($filename); 
    $ret = []; 
    $section = null; 
    $lineNum = 0; 
    $lines = explode("\n", str_replace("\r\n", "\n", $initext)); 
    foreach($lines as $line) { 
     ++$lineNum; 

     $line = trim(preg_replace('/[;#].*/', '', $line)); 
     if(strlen($line) === 0) { 
      continue; 
     } 

     if($processSections && $line{0} === '[' && $line{strlen($line)-1} === ']') { 
      // section header 
      $section = trim(substr($line, 1, -1)); 
     } else { 
      $eqIndex = strpos($line, '='); 
      if($eqIndex !== false) { 
       $key = trim(substr($line, 0, $eqIndex)); 
       $matches = []; 
       preg_match('/(?<name>\w+)(?<index>\[\w*\])?/', $key, $matches); 
       if(!array_key_exists('name', $matches)) { 
        throw new IniParserException("Variable name must not be empty! In file \"$filename\" in line $lineNum."); 
       } 
       $keyName = $matches['name']; 
       if(array_key_exists('index', $matches)) { 
        $isArray = true; 
        $arrayIndex = trim($matches['index']); 
        if(strlen($arrayIndex) == 0) { 
         $arrayIndex = null; 
        } 
       } else { 
        $isArray = false; 
        $arrayIndex = null; 
       } 

       $value = trim(substr($line, $eqIndex+1)); 
       if($value{0} === '"' && $value{strlen($value)-1} === '"') { 
        // too lazy to check for multiple closing " let's assume it's fine 
        $value = str_replace('\\"', '"', substr($value, 1, -1)); 
       } else { 
        // special value 
        switch(strtolower($value)) { 
         case 'yes': 
         case 'true': 
         case 'on': 
          $value = true; 
          break; 
         case 'no': 
         case 'false': 
         case 'off': 
          $value = false; 
          break; 
         case 'null': 
         case 'none': 
          $value = null; 
          break; 
         default: 
          if(is_numeric($value)) { 
           $value = $value + 0; // make it an int/float 
          } else { 
           throw new IniParserException("\"$value\" is not a valid value! In file \"$filename\" in line $lineNum."); 
          } 
        } 
       } 

       if($section !== null) { 
        if($isArray) { 
         if(!array_key_exists($keyName, $ret[$section])) { 
          $ret[$section][$keyName] = []; 
         } 
         if($arrayIndex === null) { 
          $ret[$section][$keyName][] = $value; 
         } else { 
          $ret[$section][$keyName][$arrayIndex] = $value; 
         } 
        } else { 
         $ret[$section][$keyName] = $value; 
        } 
       } else { 
        if($isArray) { 
         if(!array_key_exists($keyName, $ret)) { 
          $ret[$keyName] = []; 
         } 
         if($arrayIndex === null) { 
          $ret[$keyName][] = $value; 
         } else { 
          $ret[$keyName][$arrayIndex] = $value; 
         } 
        } else { 
         $ret[$keyName] = $value; 
        } 
       } 
      } 
     } 
    } 

    return $ret; 
} 

Ne farklıdır? Değişken isimler sadece alfanümerik karakterlerden oluşabilir, ancak bunlardan başka hiçbir kısıtlama içermez. Dizeler her şey no, yes, true, false, on, off, null veya none gibi özel bir değer olmak zorundadır "ile kapsüllü gerekir. Haritalama için kod bakın.

0

Aynı problemle karşılaştım ve her türlü yoldan isminden kaçmaya çalıştım.

Sonra nedeniyle INI sözdizimi hem adları ve değerleri kesilmiş olacağını hatırladı, bu yüzden aşağıdaki geçici çözüm BELKİ hile yapmak gerekir:

NL = Netherlands 
; A whitespace before the name 
NO = Norway 
PL = Poland 

Ve çalışır; çalışmaarkadaşlarından sürece) yorumları oku (her zaman böyle değildir) ve yanlışlıkla silmeyin. Yani, evet, saygısız dizi çözüm güvenli bir bahistir.

İlgili konular