0

我有一个巨大的 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')
)

如您所见,我的数组包含 30,000 个条目。我正在尝试使用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 查询。因此,换句话说,我试图一次性将 30,000 个条目插入到数据库表中(而不是在循环或其他方式中进行),例如:

INSERT INTO table_name VALUES $values; 

我遇到的问题是内爆函数似乎没有内爆我的巨大数组。当我尝试调试字符串以查看我的数组是否已内爆时,我得到空字符串或其他东西。

有谁知道我该如何解决这个问题,或者是否有更好的方法来做到这一点?同样,我不想查询我的数据库 30,000 次,我只想一次插入。

谢谢

4

6 回答 6

3

用 PHP 来做这件事,这将处理你给的多维数组:

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

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

我建议你使用transactions. 在这里阅读MySQLiPDO

于 2012-08-29T18:43:45.323 回答
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()就可以了。

于 2012-08-29T18:41:26.013 回答
0

为什么不使用事务(假设您使用的是 MySQL)?这样您就可以构建查询然后一次性提交?

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

于 2012-08-29T18:43:13.450 回答
0

你没有加入字符串,你正在爆炸数组。如果您的数据结构是正确的字符串,它会转储更像

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

请注意我在其中突出显示的引号。您首先必须单独内爆每个子数组,然后内爆父数组,例如 .

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

另外,这还取决于不包含 SQL 元字符的子数组中的各个值,例如'. 做这种事情要非常小心,因为你可以注入自己并杀死插入查询。

于 2012-08-29T18:45:08.457 回答
0

快速解决:

$rows = array();

foreach($originalArray as $row){

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

}

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

虽然我会将查询拆分为 1000 行的块。

于 2012-08-29T18:45:38.583 回答
0

Implode 不是这个工作,你想看看使用准备好的 SQL 语句,然后遍历数组,为每个数组执行语句。

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

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

}
于 2012-08-29T18:45:53.880 回答