PHP将数组拆分为数百个

PHP将数组拆分为数百个,php,Php,我有一个数组,可以容纳数千个项目(通常约5000个项目)。 我需要将此数组拆分为数百个并处理它们,然后继续处理其余的项。 到目前为止,我处理整个阵列的速度很慢。 我的代码是 foreach($result as $p){ $sqlQuery = mysql_query("INSERT INTO message_details(contact, message_id)VALUES('$p', $message_last_id)");

我有一个数组,可以容纳数千个项目(通常约5000个项目)。 我需要将此数组拆分为数百个并处理它们,然后继续处理其余的项。 到目前为止,我处理整个阵列的速度很慢。 我的代码是

foreach($result as $p){
                $sqlQuery = mysql_query("INSERT INTO message_details(contact, message_id)VALUES('$p', $message_last_id)");
                $last_id = mysql_insert_id();
                $xmlString .= "<gsm messageId=\"$last_id\">".$p."</gsm>";
                $cnt++;
            }
foreach($p结果){
$sqlQuery=mysql_query(“插入到消息_详细信息(联系人、消息_id)值($p',$message_last_id)”);
$last_id=mysql_insert_id();
$xmlString.=''.$p.'';
$cnt++;
}
如何处理阵列中数百个项目?100、200、300等等

致以最良好的祝愿,
Nicos

如果您在代码中有这样做,那么您可以使用php函数array\u chunk将数组分块为每个100个元素的数组。以下是数组块上的文档:。但正如所指出的,这不太可能成为瓶颈。

如果您在代码中有这样做,您可以使用php函数array\u chunk将数组分块为每个数组包含100个元素的数组。以下是数组块上的文档:。但正如所指出的,这不太可能成为瓶颈。

foreach($p的结果){
foreach($result as $p){
    $sqlQuery = mysql_query("INSERT INTO message_details(contact, message_id)VALUES('$p', $message_last_id)");
    $last_id = mysql_insert_id();
    $xmlString .= "<gsm messageId=\"$last_id\">".$p."</gsm>";
    $cnt++;

   if ($cnt % 1000 == 0) { usleep(100) }
}
$sqlQuery=mysql_query(“插入到消息_详细信息(联系人、消息_id)值($p',$message_last_id)”); $last_id=mysql_insert_id(); $xmlString.=''.$p.''; $cnt++; 如果($cnt%1000==0){usleep(100)} }
您可以根据需要使用
usleep
sleep
。我已经用过这个了。你会获得表现。试试看。

foreach($p作为结果){
$sqlQuery=mysql_query(“插入到消息_详细信息(联系人、消息_id)值($p',$message_last_id)”);
$last_id=mysql_insert_id();
$xmlString.=''.$p.'';
$cnt++;
如果($cnt%1000==0){usleep(100)}
}

您可以根据需要使用
usleep
sleep
。我已经用过这个了。你会获得表现。试试看。

也许你可以这样试试:

首先选择消息详细信息的最后一个ID

$sqlQuery = mysql_query("SELECT %last_id_col_name% FROM message_details ORDER BY %last_id_col_name% DESC LIMIT 1".$sInserts);
然后:

然后从该表中选择所有条目,其中id大于您首先选择的条目 写信给

$xmlString .= '<gsm messageId="'.$last_id.'">'.$p.'</gsm>';
$xmlString.=''.$p';

如果这样做,您只需要3个DB查询,而不需要数千个。

也许您可以这样做:

首先选择消息详细信息的最后一个ID

$sqlQuery = mysql_query("SELECT %last_id_col_name% FROM message_details ORDER BY %last_id_col_name% DESC LIMIT 1".$sInserts);
然后:

然后从该表中选择所有条目,其中id大于您首先选择的条目 写信给

$xmlString .= '<gsm messageId="'.$last_id.'">'.$p.'</gsm>';
$xmlString.=''.$p';

如果这样做,您只需要3个DB查询,而不需要数千个。

为什么不使用
sleep()
让SQL server恢复(或其他)?还要在每次迭代时更新XML文件。为什么处理100个项目的块会更好?瓶颈可能实际上是插入本身。首先,我将使用
INSERT-INTO。。。值(第1行),(第2行),…
语法。锁定表,您可以手动派生id,它是最后一个加上一个。我不是专业人士,但我觉得如果您像$\u array[x][I]那样拆分数组,效果会更好。这样你就可以把数组分成更多的类别等等,但这并不会加快它的速度,甚至可能会减慢它的速度more@Nicos在.Net中,当我需要进行批量插入时,我总是从需要插入的所有对象创建一个xml文档,然后将其发送到存储过程。这在PHP和MySQL中也是可能的,但我没有示例。这里有一篇关于MySQL批量插入xml的文章:PHP文档告诉您如何创建xml文档。这可能是最快的方法,但我想您需要花费一些时间来实现它。为什么不使用
sleep()
让SQL server恢复(或其他什么)?还要在每次迭代时更新XML文件。为什么处理100个项目的块会更好?瓶颈可能实际上是插入本身。首先,我将使用
INSERT-INTO。。。值(第1行),(第2行),…
语法。锁定表,您可以手动派生id,它是最后一个加上一个。我不是专业人士,但我觉得如果您像$\u array[x][I]那样拆分数组,效果会更好。这样你就可以把数组分成更多的类别等等,但这并不会加快它的速度,甚至可能会减慢它的速度more@Nicos在.Net中,当我需要进行批量插入时,我总是从需要插入的所有对象创建一个xml文档,然后将其发送到存储过程。这在PHP和MySQL中也是可能的,但我没有示例。这里有一篇关于MySQL批量插入xml的文章:PHP文档告诉您如何创建xml文档。这可能是最快的方法,但我想您需要花一点时间来实现它。自动增量会处理ID,无需在insert查询中输入自己的ID。而且,字符串连接看起来很糟糕。我会将一个数组传递给pdo或更高级别的东西。我只调整了他的插入。我不知道
$message\u last\u id
是否表示该表的id。我想说明的是,没有必要对每个循环进行插入。这就是脚本花费这么长时间的原因。Auto-increment会处理ID,无需在insert查询中输入自己的ID。而且,字符串连接看起来很糟糕。我会将一个数组传递给pdo或更高级别的东西。我只调整了他的插入。我不知道
$message\u last\u id
是否表示该表的id。我想说明的是,没有必要对每个循环进行插入。这就是脚本花费这么长时间的原因。这只是防止数据库缓冲区溢出和将数据交换到硬盘吗?可能是我看不出有更多的含义。@MikulasDite,如果您有大量数据要插入数据库,或者您缓冲了SGDB,或者您的应用程序溢出了我的应用程序