在回显之前改组xml输出

时间:2012-10-12 14:22:51

标签: php xml shuffle

我有一个脚本抓取我生成的php数据库的xml,我想在php脚本回显xml之前对行进行随机播放,这样每次访问数据库xml文件时,我都会收到数据库不同的顺序。

这是我输出xml的php脚本的一部分:

$dom =  new DOMDocument("1.0");
$node = $dom->createElement("database");
$parnode = $dom->appendChild($node); 

$query = "SELECT * FROM database WHERE 1";
$result = mysql_query($query);

header("Content-type: text/xml");


while ($row = @mysql_fetch_assoc($result)){
    // ADD TO XML DOCUMENT NODE
    $node = dom->createElement("data");
    $newnode = $parnode->appendChild($node);

    $newnode->setAttribute("id", $row['id']);
    $newnode->setAttribute("name", $row['name']);
    $newnode->setAttribute("date", $row['date']);
    $newnode->setAttribute("latitude", $row['latitude']);
    $newnode->setattribute("longitude", $row['longitude']);

}

这是我想在可能的情况下随机化xml输出的地方。这似乎是最合乎逻辑的地方,但如果有一个更好的地方,那对我来说没问题。

echo $dom->saveXML();

以下是我的xml示例:

<database>
  <data id="1" name="blah" date="2012-10-10" latitude="0" longitude="0"/>
  <data id="3" name="blah" date="2012-10-10" latitude="0" longitude="0"/>
  <data id="4" name="blah" date="2012-10-10" latitude="0" longitude="0"/>
</database>

简单地说,我希望每次访问时xml行的顺序都不同。谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是使用临时数组来存储从DB获取的行,然后将此数组洗牌,然后遍历它:

$records = array();
while ($row = @mysql_fetch_assoc($result)){
    $records[] = $row;
}

shuffle($records);

foreach ($records as $row) {
    $node = dom->createElement("data");
    $newnode = $parnode->appendChild($node);

    $newnode->setAttribute("id", $row['id']);
    ...
}

另一种方法是原样使用原始数组,而是随机化插入过程:

$prevnode = null;
while ($row = @mysql_fetch_assoc($result)){
    $node = dom->createElement("data");
    if ($prevnode && rand(0, 1) === 0) {
      $newnode = $prevnode->insertBefore($node);
    } else {
      $newnode  = $parnode->appendChild($node);
    }
    $prevnode = $newnode;

    $newnode->setAttribute("id", $row['id']);
    ...
}

答案 1 :(得分:0)

如果您的结果集不是很大并且您的数据库支持它,您可以让数据库随机为您调整结果。例如,MySQL可以这样做:

SELECT * FROM database ORDER BY rand();

您的数据库可能有所不同。

您还可以将XML生成与结果集合分开。随机播放中间阵列:

function get_database_results($dbconn=null) {
    $rows = false;
    $query = 'SELECT * FROM database';
    $res = mysql_query($query, $dbconn);
    if ($res) {
        $rows = array();
        while ($row = mysql_fetch_assoc($res)) {
            $rows[] = $row;
        }
    }
    return $rows;
}

function array_to_sxe($rows) {
    $sxe = simplexml_load_string('<database></database>');
    foreach ($rows as $row) {
        $data = $sxe->addChild('data');
        foreach ($row as $key => $value) {
            $data->addAttribute($key, $value);
        }
    }
    return $sxe;
}

$rows = get_database_results();
shuffle($rows);
$sxe = array_to_sxe($rows);
header('Content-Type: application/xml'); // NOT text/xml!
echo $sxe->asXML();

我现在会咆哮编码

你必须对你的编码更加小心!实际上,您可以非常轻松地生成格式错误的XML。

  • text/xml表示xml在7位ascii中。你的意思是不太可能。
  • application/xml表示xml是utf-8。这是DOMDocumentSimpleXML默认输出的内容,仅接受setAttribute 等方法的utf-8值!这意味着您需要绝对确定
    1. 您放入数据库的字符串是utf-8。
    2. php和数据库之间的连接是utf-8。 (使用SET NAMES utf8charset参数添加到带有PDO的DSN - 您应该使用的代替mysql_*
    3. 您从数据库中提取的字符串是utf-8,或者至少在使用前转换为utf-8。

答案 2 :(得分:-1)

您可以添加

ORDER BY rand() 

到您的SQL查询