我正在尝试将数据库记录放在多个xml文件中,但我无法做到这一点。基本上我在db表中有200行,我必须将它们放在4个不同的xml文件中,每个50个。就像它一样过了50行,应该自动创建一个新的xml文件。 但是我无法开发for循环逻辑。
<?php
//Create Database connection
$mysqli = new mysqli('localhost', 'user', 'pass', 'dbname');
if (mysqli_connect_errno()) {
echo "Connection Failed: " . mysqli_connect_errno();
}
$query = 'select * from tablename';
$result = mysqli_query($mysqli, $query);
//Create SimpleXMLElement object
$xml = new SimpleXMLElement('<xml/>');
//Add each column value a node of the XML object
while ($row = mysqli_fetch_array($result)) {
$counter = 0;
if (count($row) % 50) {
$mydata = $xml->addChild('mydata');
$mydata->Id = $row['PID'];
$fp = fopen("sitemap$counter.xml", "wb");
//Write the XML nodes
fwrite($fp, $xml->asXML());
$xml = new XML();
} else {
$counter++;
}
}
mysqli_close($mysqli);
//Create the XML file
//Close the database connection
fclose($fp);
现在db表中有200行,我想制作4个不同的xml文件,每行50行。
我无法做到这一点。请帮忙
答案 0 :(得分:0)
您所拥有的是可遍历,您希望将其分成每个50次迭代的块。
为了简洁起见,我将把它更改为四个结果行,并且我希望每次都有两次迭代,所以说,创建两个带有两个条目的文件。
您可以通过在生成器的帮助下编写一个分析迭代器的小功能来轻松完成此操作:
/**
* @param Iterator $iterator
* @param int $size
*
* @return Generator
*/
function ChunkGenerator(Iterator $iterator, $size) {
$size = max(0, (int) $size);
while ($size-- && $iterator->valid()) {
yield $iterator->key() => $iterator->current();
$size && $iterator->next();
}
}
这个小函数再次以生成器的形式返回 Traversale ,它将迭代$size
的{{1}}次迭代。
由于您的$iterator
是可遍历而非 Iterator ,因此您需要先将其包含在 IteratorIterator 中。然后你可以迭代它,然后在块内迭代。参见示例:
$result
以PID为1000开始的示例输出然后给出:
$iterator = new IteratorIterator($result);
foreach ($iterator as $void) {
echo "new chunk:\n";
foreach (ChunkGenerator($iterator, 2) as $row) {
echo $row['PID'], "\n";
}
}
正如您所看到的堆叠new chunk:
1000
1001
new chunk:
1002
1003
,内部循环为每个文件提供行。外部循环代表文件。现在很容易将XML输出逻辑放入这样的循环中:
foreach
输出(我使用示例性标准输出作为“文件名”,你可以把你的文件名放在那里)然后是:
foreach ($iterator as $void) {
//Create SimpleXMLElement object
$xml = new SimpleXMLElement('<xml/>');
foreach (ChunkGenerator($iterator, 2) as $row) {
$xml->addChild('row')->Id = $row['PID'];
}
// output the file
$xml->saveXML('php://output'); // place your filename here
}
虽然这个例子有点复杂(你们彼此之间有两个循环),它仍然代表你所拥有的建模:文件,然后是每个文件的行。
您还可以使用在线演示:https://eval.in/173066