2012-12-16 72 views
0

我有一個非常破碎/奇怪的INI文件,看起來像this解析一個奇怪的畸形ini

RowID=11668 
Name=SCNA DaCe 
PPA 
Relation=Family 
RowID=31999 
Name=PCA 

RowID=11593 
Name=CRMLEVEL 
Relation=Family 

如果可能的話,最終成爲

array("11668" => array("name"=> "SCNA DaCe", "relation"=>"Family", "ppa"=>true)); 

LINEBREAKS分離基於RowID,而不是一個適當的[section],我不知道我該怎麼讀這個,就從哪裏開始任何提示?

有不一致的外殼,某些東西沒有值(如PPA本身就在一行上),並非所有的key=vals都是爲每種情況定義的。

回答

0

這樣的事情,對象的數組就派上用場了。

http://www.laprbass.com/RAY_temp_dylan.php

<?php // RAY_temp_dylan.php 
error_reporting(E_ALL); 
echo '<pre>'; 

$str = <<<END 
RowID=11668 
Name=SCNA DaCe 
PPA 
Relation=Family 
RowID=31999 
Name=PCA 

RowID=11593 
Name=CRMLEVEL 
Relation=Family 
END; 

// SIMULATE READING WITH file() 
$arr = explode(PHP_EOL, $str); 

// COLLECT THE NORMALIZED DATA HERE 
$out = array(); 
$obj = new stdClass; 

// USE AN ITERATOR ON EACH ROW 
foreach ($arr as $row) 
{ 
    // SKIP BLANK LINES 
    $row = trim($row); 
    if (empty($row)) continue; 

    // FOR EACH ROWID CREATE A NEW OBJECT 
    if (FALSE !== strpos($row, 'RowID')) 
    { 
     // SAVE THE OLD OBJECT 
     $out[] = $obj; 
     $obj = new stdClass; 
     $obj->RowID = end(explode('=', $row)); 
    } 

    // FOR REMAINING ELEMENTS THAT ARE KEY-VALUE PAIRS 
    if (FALSE !== strpos($row, '=')) 
    { 
     $key = current(explode('=', $row)); 
     $val = end(explode('=', $row)); 
     $obj->$key = $val; 
    } 

    // FOR REMAINING ELEMENTS THAT ARE NOT KEY-VALUE PAIRS 
    else 
    { 
     $obj->$row = TRUE; 
    } 
} 
// SAVE LAST ELEMENT AT EOF 
$out[] = $obj; 

// DISCARD THE ZERO "STARTER" ELEMENT 
unset($out[0]); 
var_dump($out); 
0

你將不得不推出自己的定製解決方案來解析這個INI文件,因爲建立在parse_ini_file中的PHP基於PHP自己的php.ini格式約束。所以它必須是有效的PHP。

爲了您的目的,如果需求如每條線上的鍵/值對一樣簡單,但作爲默認布爾值true的一次性擱置值除外,那麼您可以執行下列操作。

function my_parse_ini($ini_file_name) { 
    $ini = file($ini_file_name, FILE_IGNORE_NEW_LINES); 
    $return = array(); 
    $row = null; 
    foreach ($ini as $key => $value) { 
     if ($value == '') { 
      $row = null; 
      continue; 
     } 
     @list($k, $v) = explode('=',$value); 
     if ($v === null) { 
      $v = true; 
     } 
     if ($row === null) { 
      $row = $v; 
      $return[$row] = array(); 
      continue; 
     } 
     $return[$row][$k] = $v; 
    } 
    return $return; 
} 
/* usage */ 
var_dump(my_parse_ini('test.ini')); 

這將輸出爲您的樣品ini文件下面....

array(2) { 
    [11668]=> 
    array(4) { 
    ["Name"]=> 
    string(3) "PCA" 
    ["PPA"]=> 
    bool(true) 
    ["Relation"]=> 
    string(6) "Family" 
    ["RowID"]=> 
    string(5) "31999" 
    } 
    [11593]=> 
    array(2) { 
    ["Name"]=> 
    string(8) "CRMLEVEL" 
    ["Relation"]=> 
    string(6) "Family" 
    } 
} 
+0

行ID = 31999應該是它自己的陣列,與PCA的名稱。這是其中一個問題,各地都有不一致:( 在這一點上,我有點考慮試圖將RowID = *正則表達爲[*],並試圖以這種方式解析它 – Dylan

+0

您表示,換行符分隔RowIDs,你沒有提到沒有引導行換行的RowID的可能性。 – Sherif