2012-08-29 52 views
0

我有以下形式的巨大的PHP數組:PHP破滅巨大的數組

Array 
(
    [0] => ('A', 'B', 'C', 'D', 'E', 'F') 
    [1] => ('G', 'H', 'I', 'J', 'K', 'L') 
    [2] => ('M', 'N', 'O', 'P', 'Q', 'R') 
    .... 
    [30000] => ('S', 'T', 'U', 'V', 'W', 'X') 
) 

正如你看到的,我的數組包含30000個詞條。我試圖使用implode()功能到我的數組轉換爲以下形式的字符串:

$values = ('A', 'B', 'C', 'D', 'E', 'F'), ('G', 'H', 'I', 'J', 'K', 'L'), ('M', 'N', 'O', 'P', 'Q', 'R'), ('S', 'T', 'U', 'V', 'W', 'X') 

爲了能夠做一個MySQL的INSERT查詢。因此,爲了話,我想插入30000項到數據庫表中的一個鏡頭(不包括在一個循環或某事做),如:

INSERT INTO table_name VALUES $values; 

我遇到的問題是,破滅功能似乎並沒有破壞我的龐大陣列。當我嘗試調試字符串以查看我的數組是否已經崩潰時,我得到空字符串或其他東西。

有沒有人知道我可以如何解決這個問題,或者如果有更好的方法來做到這一點?再次,我不想查詢我的數據庫30,000次,我只是想做一次插入。

謝謝

+0

我認爲'implode'是用於接合串.. –

+0

是'( 'A', 'B', 'C', 'd', 'E', 'F') '作爲一個字符串或數組存儲在你的數組中? –

+1

您是否嘗試過使用相同的代碼,但使用更多可管理大小的數組? –

回答

3

implode不多維數組。在每個指標的值應該用雙引號,讓他們解釋爲字符串:

Array 
(
    [0] => "('A', 'B', 'C', 'D', 'E', 'F')" 
    [1] => "('G', 'H', 'I', 'J', 'K', 'L')" 
    [2] => "('M', 'N', 'O', 'P', 'Q', 'R')" 
    .... 
    [30000] => "('S', 'T', 'U', 'V', 'W', 'X')" 
) 

一旦你所面對的是一維數組,implode()將工作。

+0

當我打電話給gettype('A','B','C','D','E','F')時,它說。因此('A','B','C','D','E','F')被作爲一個字符串來存儲,而不是一個數組 – user765368

+0

嗯......你如何使用'implode()'? – Matt

+1

其實代碼的工作原理,我只是發現這是一個谷歌瀏覽器的問題,由於某些原因鉻沒有顯示任何輸出,但當我切換到Firefox,我得到了我的輸出 – user765368

0

爲什麼你不使用一個事務(假設你正在使用MySQL)?這樣你可以建立你的查詢,然後一次提交?

http://dev.mysql.com/doc/refman/5.0/en/commit.html

+0

OP明確指出,「內爆」不起作用他認爲它的方式。這個問題與大插入無關。 – Matt

+0

@Matt OP也問是否有更好的方法來做這件事,而且他不想查詢DB 30k次。僅提供替代解決方案 – dcbarans

3

用PHP做到這一點,這將處理您已經給出了多維數組:您使用transactions

foreach($array as $arr){ 
    $values[] = "('".implode("','", $arr)."')"; 
} 

$values = implode(",", $values); 
INSERT INTO table_name VALUES $values; 

我建議。在這裏閱讀MySQLiPDO

0

你沒有加入字符串,你是爆炸數組。如果你的數據結構是正確的字符串,它會傾倒更多像

[0] => "(a,b,c)", 
     ^-------^--- 
[1] => "(d,e,f)", 
     ^-------^--0 
etc... 

請注意我已經突出顯示的引號內。你首先必須分別將這些子數組中的每個子數組內爆,然後使父數組爆炸,

foreach ($yourarr as $key => $subarr) { 
    $yourarr[$key] = "('" . implode("','", $subarr) . "')"; 
} 
$bigstring = implode($yourarr); 

另外,這也取決於個人的價值觀不包含你的孩子陣列SQL metacharcters,像'。做這種事情要非常小心,因爲你可以注入自己並殺死插入查詢。

0

快速修復:

$rows = array(); 

foreach($originalArray as $row){ 

    $rows[] = '(' . implode(',' $row) . ')'; 

} 

$finalString = implode(',', $rows); 

雖然我會假設1000行的塊分割查詢。

0

Implode不是這個工作,你想看看使用準備好的SQL語句,然後遍歷數組,執行每個數組的語句。

http://php.net/manual/en/mysqli.prepare.php

foreach($your_array as $entry) { 
    // execute the prepared sql statement here 

} 
+0

循環查詢是一個錯誤。你應該只使用一個查詢來完成這一切。考慮服務器性能以執行30000個查詢 –