PHPで配列同士の計算

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
example

PHPで配列同士の計算

#1

投稿記事 by example » 11年前

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ファイルを読み込んで配列に格納してから計算するのかなと考えているのですがいまいちわかりません。 よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: PHPで配列同士の計算

#2

投稿記事 by みけCAT » 11年前

まず、きちんとした入力仕様を定義できますか?
今出ている例だと、例えば以下のように書けます。(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で配列同士の計算

#3

投稿記事 by softya(ソフト屋) » 11年前

PHP5ならsimplexml_load_fileでオブジェクトにパース出来ると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: PHPで配列同士の計算

#4

投稿記事 by YuO » 11年前

みけ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といったスキーマ言語が定義されているのですから。

example

Re: PHPで配列同士の計算

#5

投稿記事 by example » 11年前

皆様ご返答ありがとうございます。

実際の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だけ配列に入れることもできないという状況です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: PHPで配列同士の計算

#6

投稿記事 by softya(ソフト屋) » 11年前

なにがどううまくいかないか説明してもらえますか。
うまく出来ないというのは便利な言葉ですが、実は何をしたのか全く説明にならない言葉でもあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

example

Re: PHPで配列同士の計算

#7

投稿記事 by example » 11年前

申し訳ございません。

まず初期段階として、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で囲まれた部分のみを抽出使用としているのですがこちらでもできない状態です。

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: PHPで配列同士の計算

#8

投稿記事 by YuO » 11年前

文法上のエラーがそこかしこにあるので,まずはそちらを直すところから始めた方がよいかと。

おそらく,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を得て,そこから配列を自分で作ります。
非表示エリア
この非表示エリアを表示するには、登録し、ログインする必要があります。

example

Re: PHPで配列同士の計算

#9

投稿記事 by example » 11年前

ありがとうございます。

自分はファイルを外部から読み込むため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;

がいまいち不明なのですがどういったことでしょうか?

閉鎖

“C言語何でも質問掲示板” へ戻る