我有一个脚本,它可以抓取由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时,xml行的顺序都不同。谢谢你的帮助。
发布于 2012-10-12 22:27:44
解决这个问题的一种方法是使用一个临时数组来存储从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']);
...
}发布于 2012-10-12 23:25:43
如果您的结果集不是很大,并且您的数据库支持它,您可以让数据库为您打乱结果。例如,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格式。这不太可能是您的meant.application/xml所指的xml是utf-8。这是DOMDocument和SimpleXML默认输出的内容,并且只接受像setAttribute这样的方法的utf-8值。这意味着您需要绝对确定:SET NAMES utf8或charset参数--您应该使用这些参数而不是mysql_*)之前被转换为utf-8
发布于 2012-10-12 22:27:48
您可以添加
ORDER BY rand() 添加到您的SQL查询
https://stackoverflow.com/questions/12861140
复制相似问题