PHP内爆不适用于大阵列?

时间:2014-02-25 13:12:30

标签: php arrays limit implode

我有一个包含30k项目的数组,而implode什么都不返回。没有错误信息,没有内存问题,只是没有。

如果我使用array_slice并将数组切成100个项目,那么它可以正常工作。它也适用于7k阵列,但不适用于此。

然而,在another topic中我找到了这个代码,它运行得很好:

$arr = array();
for ($i = 0; $i < 50000; $i++) {
$arr[] = str_shuffle('This sentance is of average length, which The Internet says is  aboout 14.2 words.'); 
}
echo implode(PHP_EOL, $arr);

但是使用PHP_EOL我不能在我的选择中使用它,字符串需要用','分隔。

所以我有两个问题:有没有办法使这项工作,我怎么能抓住这个错误?因为测试implode输出不起作用,is_null,strlen,is_string,empty,isset,所有这些测试都失败了。

1 个答案:

答案 0 :(得分:1)

编辑:Facepalm写完这个答案后添加一个for循环的时刻?标记似乎没有比仅使用它输出数据更好。无论如何,我想你可以试试

<?
 $questionMarks =implode(',',array_fill(0,sizeof($myarray),'?'));
?>

看看你是否有更多的运气。

您可以使用参数化查询来规避您的问题。

<?php

$db = new PDO(...);

//$myarray is some random sized php array of potential myid values
$questionMarks='';

//check to see if runtime is acceptible for your applicaition
for ($i = 0; sizeof($myarray); $i++)
    $questionMarks=",?";
$questionMarks=substr($questionMarks,1,strlen($questionMarks)-1);

/* you could try implode(',',array_fill(0,sizeof($myarray),'?')) but as you said implode might not work */

$sql = 'select myfield from mytable where myid in ('.$questionMarks.')';
$sth = $db->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute($myarray);
if (!$sth) {
    echo "\nPDO::errorInfo():\n";
    print_r($db->errorInfo());

}  


while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
   echo $row['myfield']  . "<br />";
}
?>