PHP附加一个数组

时间:2011-05-12 14:33:42

标签: php arrays

我有一些基本上做我想要的代码,但我总是希望尽可能简化和提高效率,所以我在这里。

基本上,我有一个页面列表,每个页面运行一个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);

}

有什么想法吗?感谢

4 个答案:

答案 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数组声明的一个小错误