私は大学での講義のプロジェクトに取り組んでおり、現在 2 週間以上解決策を探していますが、うまくいきません。
特定の JSON または XML ファイルを生成して、後で D3 や Sigma などで視覚化する必要があるプロジェクトがあります。
mysql データベースがあり、すべてのコードは Javascript で記述されており (ライブラリでわかるように)、pho を使用してデータベースからデータを取得し、適切な形式で取得します。php で作成しようとした xml ファイルの例を次に示します (Sigma で視覚化するための gexf ファイルですが、xml とまったく同じです)。
<?xml version="1.0" encoding="UTF-8"?>
<gexf xmlns="http://www.gexf.net/1.2draft" version="1.2">
<meta lastmodifieddate="2009-03-20">
<creator>Gexf.net</creator>
<description>A hello world! file</description>
</meta>
<graph mode="static" defaultedgetype="directed">
<nodes>
<node id="0" label="Hello" />
<node id="1" label="Word" />
</nodes>
<edges>
<edge id="0" source="0" target="1" />
</edges>
</graph>
</gexf>
そして、ここに私がxmlを作成しようとした私のphpコードがあります:
<?php
set_time_limit(500000000);
ini_set('memory_limit', '-1');
class XmlWriter2 {
var $xml;
var $indent;
var $stack = array();
function XmlWriter($indent = ' ') {
$this->indent = $indent;
$this->xml = '<?xml version="1.0" encoding="utf-8"?>'."\n";
}
function _indent() {
for ($i = 0, $j = count($this->stack); $i < $j; $i++) {
$this->xml .= $this->indent;
}
}
function push($element, $attributes = array()) {
$this->_indent();
$this->xml .= '<'.$element;
foreach ($attributes as $key => $value) {
$this->xml .= ' '.$key.'="'.htmlentities($value).'"';
}
$this->xml .= ">\n";
$this->stack[] = $element;
}
function element($element, $content, $attributes = array()) {
$this->_indent();
$this->xml .= '<'.$element;
foreach ($attributes as $key => $value) {
$this->xml .= ' '.$key.'="'.htmlentities($value).'"';
}
$this->xml .= '>'.htmlentities($content).'</'.$element.'>'."\n";
}
function emptyelement($element, $attributes = array()) {
$this->_indent();
$this->xml .= '<'.$element;
foreach ($attributes as $key => $value) {
$this->xml .= ' '.$key.'="'.htmlentities($value).'"';
}
$this->xml .= " />\n";
}
function pop() {
$element = array_pop($this->stack);
$this->_indent();
$this->xml .= "</$element>\n";
}
function getXml() {
return $this->xml;
}
}
/*
$xml = new XmlWriter2();
$array = array(
array('monkey', 'banana', 'Jim'),
array('hamster', 'apples', 'Kola'),
array('turtle', 'beans', 'Berty'),
);
$xml->push('zoo');
foreach ($array as $animal) {
$xml->push('animal', array('species' => $animal[0]));
$xml->element('name', $animal[2]);
$xml->element('food', $animal[1]);
$xml->pop();
}
$xml->pop();
print $xml->getXml();
<?xml version="1.0" encoding="utf-8"?>
<zoo>
<animal species="monkey">
<name>Jim</name>
<food>banana</food>
</animal>
<animal species="hamster">
<name>Kola</name>
<food>apples</food>
</animal>
<animal species="turtle">
<name>Berty</name>
<food>beans</food>
</animal>
</zoo>
*/
mysql_connect("127.0.0.1", "root", "manager") or die(mysql_error());
mysql_select_db("enrondata") or die(mysql_error());
$data1 = mysql_query("SELECT DISTINCT sId FROM mailToId WHERE date
BETWEEN '01.06.2002' AND '30.06.2002' UNION SELECT DISTINCT rId FROM
mailToId WHERE date BETWEEN '01.06.2002' AND '30.06.2002'") or die
(mysql_error());
$data2 = mysql_query("SELECT sender, recipient, count(*) AS numMails
FROM mailTo WHERE date BETWEEN '01.06.2002' AND '30.06.2002' GROUP
BY sender, recipient") or die (mysql_error());
$users = array();
$id = 0;
while($tmpUsers = mysql_fetch_array($data1)){
$tmpArray['id'] = $tmpUsers['sId'];
$user = mysql_query("SELECT email FROM users WHERE id=".$tmpUsers['sId']);
while($tmpUser = mysql_fetch_array($user)){
$tmpArray['email'] = $tmpUser['email'];
}
array_push($users, $tmpArray);
}
$xml = new XmlWriter2();
$xml->push('gexf', array('xmlns' => 'http://www.gexf.net/1.2draft" version="1.2'));
$xml->push('meta', array('lastmodifieddate' => '2009-03-20'));
$xml->element('creator', 'Gexf.net');
$xml->element('description', 'A hello world! file');
$xml->pop();
$xml->push('graph', array('mode' => 'static', 'defaultedgetype' => 'directed'));
$xml->push('nodes');
for($i = 0; $i < count($users); $i++){
$xml->push('node', array('id' => $users['id'],
'label' => $users['email']));$xml->pop();
}
$xml->pop();
$xml->push('edges');
while($tmp = mysql_fetch_array($data2)){
$xml->push('edge', array('id' => id,
'source' => $tmp['sender'], 'target' => $tmp['recipient'], 'weight'
=> $tmp['numMails']));$xml->pop();
$id++;
}
$xml->pop();
$xml->pop();
$xml->pop();
print $xml->getXml();
?>
コードは正しいですが、何時間もかかります。本当に、30分経ってもまだ終わっていません。そして、それを改善して非常に速く取得する方法がわかりません。または、php を使用せずに mysql データベースから適切な形式でデータを取得する別の可能性はありますか?
私を助けてください。締め切りが迫っていますが、アイデアがなく、自分の問題に合うものがウェブ上で見つかりませんでした。