ページ 1 / 1
PHPで配列同士の計算
Posted: 2013年12月10日(火) 16:29
by example
PHPで二つのxmlファイルを読み込んでそのxmlファイル同士の計算を行いたいです。
具体的に言うと
ex1.xml
<array>
<real>0.3</real>
<real>0.2</real>
<real>0.2</real>
</array>
ex2.xml
<array>
<real>0.4</real>
<real>0.5</real>
<real>0.6</real>
</array>
このようなファイルを読み込んでこれらの一行目同士の引き算、2行目同士の引き算を行いたいです。
xmlファイルを読み込んで配列に格納してから計算するのかなと考えているのですがいまいちわかりません。 よろしくお願いします。
Re: PHPで配列同士の計算
Posted: 2013年12月10日(火) 21:17
by みけCAT
まず、きちんとした入力仕様を定義できますか?
今出ている例だと、例えば以下のように書けます。(INPUTが入力全体を示す)
コード:
<INPUT> := "<array>" LF <NUMBERLIST> "</array>" LF
<NUMBERLIST> := <NUMBERELEMENT> <NUMBERLIST> | ""
<NUMBERELEMENT> := "<real>" <REAL> "</real>" LF
<REAL> := <DIGIT> <DIGITS> | <DIGIT> <DIGITS> "." <DIGIT> <DIGITS>
<DIGITS> := <DIGIT> <DIGITS> | ""
<DIGIT> := "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<LF> := "\n" | "\r\n"
また、「引き算」とは何ですか?素直に行に含まれる実数を引き算した値に置換し、それ以外の部分はそのまま残すことですか?
二つのファイルの行数が違う場合はどうしますか?
Re: PHPで配列同士の計算
Posted: 2013年12月10日(火) 22:04
by softya(ソフト屋)
PHP5ならsimplexml_load_fileでオブジェクトにパース出来ると思います。
Re: PHPで配列同士の計算
Posted: 2013年12月10日(火) 22:52
by YuO
みけCAT さんが書きました:まず、きちんとした入力仕様を定義できますか?
今回はXMLなので,例えば
コード:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema
elementFormDefault="unqualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:element name="array">
<xs:complexType>
<xs:sequence>
<xs:element name="real" minOccurs="3" maxOccurs="3" type="xs:float" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
などが,仕様としては適当ではないでしょうか。
せっかく,XMLにはXML SchemaやRELAX NGといったスキーマ言語が定義されているのですから。
Re: PHPで配列同士の計算
Posted: 2013年12月11日(水) 15:02
by example
皆様ご返答ありがとうございます。
実際のXMLファイルは
コード:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<real>0.1</real>
<real>0.2</real>
<real>0.4</real>
<real>0.8</real>
<real>0.3</real>
</array>
</plist>
このような形でrealで挟まれた数字が同じ数あるxmlファイルが二つあります。
そして、real で挟まれた同じ行の数字どうしの引き算を行いたいということです。
そのためにはまず配列に入れてから計算するのではないかと考えていたのですがうまくrealだけ配列に入れることもできないという状況です。
Re: PHPで配列同士の計算
Posted: 2013年12月11日(水) 15:44
by softya(ソフト屋)
なにがどううまくいかないか説明してもらえますか。
うまく出来ないというのは便利な言葉ですが、実は何をしたのか全く説明にならない言葉でもあります。
Re: PHPで配列同士の計算
Posted: 2013年12月11日(水) 16:29
by example
申し訳ございません。
まず初期段階として、realで囲まれたものを配列に入れることができません。
コード:
$list = file_get_contents("ex1.xml");
$dom = new DOMDocument('1.0,'UTF-8');
$dom->loadXML($list);
$datanode = $dom->getElememtByTagName("array")->item(0);
$sample = $datenode->getElememtByTagName("real")->item(0)->nodeValue;
echo $example;
現在じぶんではこのようにしてrealで囲まれた部分のみを抽出使用としているのですがこちらでもできない状態です。
Re: PHPで配列同士の計算
Posted: 2013年12月11日(水) 17:26
by YuO
文法上のエラーがそこかしこにあるので,まずはそちらを直すところから始めた方がよいかと。
おそらく,php -lのチェックだけで,5行目に文法エラーが見つかると思います。
そもそも,DOMDocumentのコンストラクタを指定する必要はありません。
# 一からDOMを作るなら別ですが。
refs)
http://www.php.net/manual/ja/domdocument.construct.php
次に,DOMElement::getElement
sByTagNameであって,DOMElement::getElementByTagNameではありません。
このあたりは,PHPのログを吐かせていれば知ることができるはずです。
# PHP Fatal error: Call to undefined method DOMElement::getElementByTagName()
refs)
http://www.php.net/manual/ja/domelement ... agname.php
複数形であることからわかるように,DOMNodeListというコレクションが返ります。
あとは,これをforeachでまわして対応するDOMElementを得て,そこから配列を自分で作ります。
非表示エリア
この非表示エリアを表示するには、登録し、ログインする必要があります。
Re: PHPで配列同士の計算
Posted: 2013年12月11日(水) 18:05
by example
ありがとうございます。
自分はファイルを外部から読み込むためfile_get_contentsでファイルを読み込んで行ったのですが
コード:
$list1 = file_get_contents("http://localhost/ex1.xml");
$list2 = file_get_contents("http://localhost/ex2.xml");
$dom1 = new DOMDocument();
$dom1->loadXML($list1);
$data1 = $dom1->getElementsByTagName("real");
$array1 = [ ];
foreach ($data1 as $node)
{
$array1[] = (float)$node->nodeValue;
}
$dom2 = new DOMDocument();
$dom2->loadXML($list2);
$data2 = $dom2->getElementsByTagName("real");
$array2 = [ ];
foreach ($data2 as $node)
{
$array2[] = (float)$node->nodeValue;
}
if (count($array1) === count($array2))
{
for ($i = 0; $i < count($array1); ++$i)
{
????
}
}
file_get_contents で読み込む際もこのようなかきかたでよろしいのでしょうか?
またたびたびでてくる 'real' や最後のfor文のなかの echo $i . ' : ' . $array1[$i] . ' - ' . $array2[$i] . ' = ' . ($array1[$i] - $array2[$i]) . PHP_EOL;
がいまいち不明なのですがどういったことでしょうか?