2011-05-12 97 views
2

我有一些本質上做我想做的事情的代碼,但我總是希望儘可能使它更簡單,更高效,所以我就是這樣。PHP追加陣列

基本上,我的每一個運行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

如果我明白你正在嘗試做正確,那麼是的,有更容易的方法:

$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數組

0

你有什麼錯誤?

我可以在這裏看到可能出現的問題

$ V = $行[ 'X'。 '|' $行[ 'Y']。 '|'。$行[ 'Z']」 ;」 。 $ V;

$ r = array(「$ page」=>「$ v」);

刪除$ v上的報價代碼,並在循環之前將$ v定義爲空變量。

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 = array(
    0 => array('X' => 'someval', 'Y' => 'otherval', 'Z' => 'otherotherval'), 
    1 => array('X' => etc.....), 
    etc... 
) 

,如果你需要寫這個$ data數組輸出到某個文件進行其他處理時,可以使用serialize()將其輸出爲一個字符串,該字符串可以使用unserialize()簡單地轉換回本機PHP陣列。

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']; 
    } 
} 

也許有點快。

+0

嘿,歡迎來到堆棧溢出。請使用編輯器中的「{}」按鈕或至少4個空格前綴來正確地格式化您的代碼。更多信息[關於元問題。計算器(http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks)。 – jpjacobs 2012-01-05 10:05:29