我有一些基本上做我想要的代码,但我总是希望尽可能简化和提高效率,所以我在这里。
基本上,我有一个页面列表,每个页面运行一个SQL查询并提取X个相关记录,通过保存到文本文件将每个记录附加到前者,然后重新打开以进行进一步处理,如下所示:
foreach($pages as $page){
$fp = fopen("$page.txt", 'w');fclose ($fp);
$result = $db->query("SELECT X, Y, Z FROM Table WHERE Pages LIKE '%$page%'");
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
$v = $row['X'].'|'.$row['Y'].'|'.$row['Z'].';';
file_put_contents("$page.txt", $v, FILE_APPEND);
}
$data = file_get_contents("$page.txt");
$data = explode(';', $data);
}
现在虽然完成了工作,但我想知道更好的方法是什么,我已经尝试搞乱混合结果,希望这会起作用,但它会产生错误:
foreach($pages as $page){
$result = $db->query("SELECT X, Y, Z FROM Table WHERE Pages LIKE '%$page%'");
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
$v = $row['X'].'|'.$row['Y'].'|'.$row['Z'].';' . $v;
$r = array("$page"=>"$v");
}
$data = join($r["$page"]);
$data = explode(';', $data);
}
有什么想法吗?感谢
答案 0 :(得分:1)
你的代码效率很低。你打开一个文件并立即关闭它,这就是创建文件。然后使用file_get_contents()以追加模式为循环的每次迭代输出到该文件。这意味着PHP必须重新打开文件,跳到最后,写一些文本,然后再次关闭它。这就像去杂货店,买东西,开车回家,回到商店,买另一件物品,开车回家等等......这是浪费时间。
相反,尝试这样的事情:
foreach ($pages as $page) {
$result = $db->query(...) or die('db error...');
$data = array();
while($row = $result->fetchArray(...)) {
$data[] = $row; // append the fetched row to the $data array
}
... do something with $data here ...
}
每个while()
循环完成后,$ data将是类似于:
$data = array(
0 => array('X' => 'someval', 'Y' => 'otherval', 'Z' => 'otherotherval'),
1 => array('X' => etc.....),
etc...
)
如果您需要将此$ data数组写入文件以便在其他地方进行处理,您可以使用serialize()
将其作为字符串输出,使用{{3}可以将其简单地转换回本机PHP数组}。
答案 1 :(得分:1)
您也可以这样做:
$data = array();
foreach($pages as $page){
$result = $db->query("SELECT CONCAT(X, '|', Y, '|', Z) as `data` FROM Table WHERE Pages LIKE '%$page%'");
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
$data[] = $row['data'];
}
}
也许快一点。
答案 2 :(得分:0)
你错在哪里?
我可以在这里看到可能的问题
$ v = $ row ['X']。'|'。$ row ['Y']。'|'。$ row ['Z']。';' 。 $ V;
$ r = array(“$ page”=>“$ v”);
删除$ v上的引号代码,并在循环之前将$ v定义为空变量。
答案 3 :(得分:0)
如果我理解你正在尝试做什么,那么是的,有更简单的方法:
$data = array();
foreach($pages as $page){
$result = $db->query("SELECT X, Y, Z FROM Table WHERE Pages LIKE '%$page%'");
while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
$data[] = $row['X'].'|'.$row['Y'].'|'.$row['Z'];
}
}
如果我误解了,那我很抱歉。
修改强>
修复了$ data数组声明的一个小错误