0

私はこのデータを扱っています:

name,address_one,address_two,address_postcode
Bob,1 A Street,A town,AA11AA
Andy,92 Church St,Manchester,M20 3JN
Sarah,893 London Road,Enfield,EN3 9HB
Freda,67 Green Close,Newcastle,Nw5 2ED

これは整形式の .csv ファイルです。XMLとしてフォーマットするために、それを解析して多次元のPHP配列に変換できる必要があります。

成功すると、配列は次のようになります。

Array
(
['name']=> Bob
[0] => Array
    (
        [address] => Array
            (
                [one] => 1 A Street
                [two] => A town
                [postcode] => WC2 9GH

            )
    )
['name']=> Andy
[1] => Array
    (
        [address] => Array
            (
                [one] => 92 Chuch St
                [two] => Manchester
                [postcode] => M20 3JN

            )
    )
... omitted
)

次に、これを次のような XML に変換します。

<?xml version="1.0"?>
<root>
<name>Bob</name>
<address>
<one>1 A Street</one>
<two>A town</two>
<postcode>AA11AA</postcode>
</address> 
<name>Andy</name>
<address>
<one>92 Chuch St</one>
<two>Manchester</two>
<postcode>M20 3JN</postcode>
</address>
...omitted
</root>

私はこのコードに近づいています:

public function parseFile($fileIn)
{

    if (($handle = fopen("$fileIn", "r")) !== FALSE) 
    {

        $header = NULL;
         while (($row = fgetcsv($handle, 1000, ',')) !== FALSE)
            {
                    if(!$header)
            {
                $header = $row;
                foreach($header as $k => $v)
                {                   
                    if($x = strpos("$v", '_'))
                    {
                        $child = substr("$v", $x+1);
                        array_push($header, $child);
                    }
                }
            } else {
                        $data[] = array_combine($header, $row);
            }
            }   

        print_r($data);

            fclose($handle);
    } else {
        throw new Exception('Unable to open the file!');
    }
} // parseFile

しかし、私のパラメータが同期していないようです。

Warning:  array_combine(): Both parameters should have an equal number of elements in

var_dump($header);

明らかにする:

Array
(
[0] => 
[1] => 
[2] => 
[3] => 
)

少し巻き戻すと:

$header = NULL;
while (($row = fgetcsv($handle, 1000, ',')) !== FALSE)
{
if(!$header) $header = $row;
else $data[] = array_combine($header, $row);
}   
print_r($data);

私は得る:

Array
(
[0] => Array
    (
        [name] => Bob
        [address_one] => 1 A Street
        [address_two] => A town
        [address_postcode] => AA11AA
    )

[1] => Array
    (
        [name] => Andy
        [address_one] => 92 Church St
        [address_two] => Manchester
        [address_postcode] => M20 3JN
    )

これは近いですが、.csv ファイルの見出し (文字列「_」) を親子ノード (配列ではなく XML の観点から考えて) に分割できる必要があります。

たとえば、address_one は次のようになります。

Array
(
[0] => Array
    (
    [address] => Array
                (
                   [one] => 1 A Street
        )
)
)

ここで、one は address の子です。同様に、csv ファイルの他のすべての見出しについても、アンダースコアが含まれています。アンダースコアのない見出しは、通常どおり値にマップされます。

手伝って頂けますか?

4

1 に答える 1

0

問題は、「$header = $row;」と言うことです。後で追加データをヘッダーに追加します (array_push($header, $child))。

これにより、次のような配列が得られます。

array(
    [0] => name
    [1] => address_one
    [2] => address_two
    [3] => address_postcode
    [4] => one
    [5] => two
    [6] => postcode
);

このデータを除外する前に、デフォルト値を設定しないでください。したがって、 $tmpHeaders = array(); を使用できます。次に、行のデータに基づいて入力します。

このようなもの:

$tmpHeaders = [];
foreach ($row as $key => $value) {
    if($x = strpos("$value", '_')) {
        $value = substr("$value", $x + 1);
    }

    array_push($tmpHeaders, $value);
}
$header = $tmpHeaders;

このようにして、データ配列とヘッダー配列に同じ量の要素が含まれます。これで、名前を除外して、住所フィールドを配列フィールドに分離できます。

于 2013-03-17T18:16:19.550 に答える