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ファイルを読み込んで配列に格納してから計算するのかなと考えているのですがいまいちわかりません。 よろしくお願いします。
PHPで配列同士の計算
Re: PHPで配列同士の計算
まず、きちんとした入力仕様を定義できますか?
今出ている例だと、例えば以下のように書けます。(INPUTが入力全体を示す)
また、「引き算」とは何ですか?素直に行に含まれる実数を引き算した値に置換し、それ以外の部分はそのまま残すことですか?
二つのファイルの行数が違う場合はどうしますか?
今出ている例だと、例えば以下のように書けます。(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"
二つのファイルの行数が違う場合はどうしますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: PHPで配列同士の計算
PHP5ならsimplexml_load_fileでオブジェクトにパース出来ると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: PHPで配列同士の計算
今回はXMLなので,例えばみけCAT さんが書きました:まず、きちんとした入力仕様を定義できますか?
<?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で配列同士の計算
皆様ご返答ありがとうございます。
実際のXMLファイルは
このような形でrealで挟まれた数字が同じ数あるxmlファイルが二つあります。
そして、real で挟まれた同じ行の数字どうしの引き算を行いたいということです。
そのためにはまず配列に入れてから計算するのではないかと考えていたのですがうまくrealだけ配列に入れることもできないという状況です。
実際の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 で挟まれた同じ行の数字どうしの引き算を行いたいということです。
そのためにはまず配列に入れてから計算するのではないかと考えていたのですがうまくrealだけ配列に入れることもできないという状況です。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: PHPで配列同士の計算
なにがどううまくいかないか説明してもらえますか。
うまく出来ないというのは便利な言葉ですが、実は何をしたのか全く説明にならない言葉でもあります。
うまく出来ないというのは便利な言葉ですが、実は何をしたのか全く説明にならない言葉でもあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: PHPで配列同士の計算
申し訳ございません。
まず初期段階として、realで囲まれたものを配列に入れることができません。
現在じぶんではこのようにしてrealで囲まれた部分のみを抽出使用としているのですがこちらでもできない状態です。
まず初期段階として、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で配列同士の計算
文法上のエラーがそこかしこにあるので,まずはそちらを直すところから始めた方がよいかと。
おそらく,php -lのチェックだけで,5行目に文法エラーが見つかると思います。
そもそも,DOMDocumentのコンストラクタを指定する必要はありません。
# 一からDOMを作るなら別ですが。
refs) http://www.php.net/manual/ja/domdocument.construct.php
次に,DOMElement::getElementsByTagNameであって,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を得て,そこから配列を自分で作ります。
おそらく,php -lのチェックだけで,5行目に文法エラーが見つかると思います。
そもそも,DOMDocumentのコンストラクタを指定する必要はありません。
# 一からDOMを作るなら別ですが。
refs) http://www.php.net/manual/ja/domdocument.construct.php
次に,DOMElement::getElementsByTagNameであって,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で配列同士の計算
ありがとうございます。
自分はファイルを外部から読み込むためfile_get_contentsでファイルを読み込んで行ったのですが
file_get_contents で読み込む際もこのようなかきかたでよろしいのでしょうか?
またたびたびでてくる 'real' や最後のfor文のなかの echo $i . ' : ' . $array1[$i] . ' - ' . $array2[$i] . ' = ' . ($array1[$i] - $array2[$i]) . PHP_EOL;
がいまいち不明なのですがどういったことでしょうか?
自分はファイルを外部から読み込むため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)
{
????
}
}
またたびたびでてくる 'real' や最後のfor文のなかの echo $i . ' : ' . $array1[$i] . ' - ' . $array2[$i] . ' = ' . ($array1[$i] - $array2[$i]) . PHP_EOL;
がいまいち不明なのですがどういったことでしょうか?