0

私はこのように見える本当に壊れた/奇妙な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));

RowID改行は適切なものではなくに基づいて区切られて [section]いますが、これをどのように読むことができるかわかりません。どこから始めればよいかについてのヒントはありますか?

大文字と小文字が一致していない、特定のものには値がない (PPA行にそれ自体があるなど)、すべてkey=valsがケースごとに定義されているわけではありません。

4

2 に答える 2

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);
于 2012-12-16T17:32:14.357 に答える
0

PHP に組み込まれているparse_ini_fileは、PHP 独自の php.ini 形式の制約に基づいているため、この INI ファイルを解析するには、独自のカスタム ソリューションを作成する必要があります。したがって、有効な PHP でなければなりません。

あなたの目的のために、要件が各行のキーと値のペアと同じくらい単純である場合、デフォルトのブール値 true としての 1 回限りの孤立した値を除いて、次のようなことができます。

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"
  }
}
于 2012-12-16T16:58:06.110 に答える