首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在回显之前混洗xml输出

在回显之前混洗xml输出
EN

Stack Overflow用户
提问于 2012-10-12 22:22:51
回答 3查看 473关注 0票数 1

我有一个脚本,它可以抓取由php生成的数据库的xml,我想在php脚本回显xml之前对行进行混洗,这样每次我访问数据库xml文件时,我就会以不同的顺序接收数据库。

下面是输出xml的php脚本的一部分:

代码语言:javascript
复制
$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输出的地方。这似乎是最合乎逻辑的地方,但如果有更好的地方,那对我来说很好。

代码语言:javascript
复制
echo $dom->saveXML();

下面是我的xml示例:

代码语言:javascript
复制
<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时,xml行的顺序都不同。谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-12 22:27:44

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

代码语言:javascript
复制
$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']);
    ...
}

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

代码语言:javascript
复制
$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
EN

Stack Overflow用户

发布于 2012-10-12 23:25:43

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

代码语言:javascript
复制
SELECT * FROM database ORDER BY rand();

您的数据库可能不同。

您还可以将XML生成与结果收集分开。对中间数组进行混洗:

代码语言:javascript
复制
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格式。这不太可能是您的meant.
  • application/xml所指的xml是utf-8。这是DOMDocumentSimpleXML默认输出的内容,并且只接受像setAttribute这样的方法的utf-8值。这意味着您需要绝对确定:
    1. 您输入到数据库中的字符串是utf-8。
    2. php和数据库之间的连接是utf-8。(对具有PDO的DSN使用SET NAMES utf8charset参数--您应该使用这些参数而不是mysql_*)
    3. That。您从数据库中提取的字符串是utf-8,或者至少在use.

之前被转换为utf-8

票数 0
EN

Stack Overflow用户

发布于 2012-10-12 22:27:48

您可以添加

代码语言:javascript
复制
ORDER BY rand() 

添加到您的SQL查询

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12861140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档