【问题标题】:PHP implode not working for big array?PHP 内爆不适用于大数组?
【发布时间】:2014-02-25 13:12:29
【问题描述】:

我有一个包含 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,所有这些测试都失败了。

【问题讨论】:

  • 您的错误日志中有什么内容吗?
  • 我不能在我的选择中使用它”。为什么?发生什么了?它会弹出错误吗?空白页?你的浏览器关闭了吗?你的服务器开始烧了吗? Apache 服务是否停止?它是否开始发送垃圾邮件?也就是说,你不应该这样做。您为每个请求生成至少 3.91 MB ((50000 * 82) / 1024 / 1024) 更多内容。
  • 有例如项目编号。 7k1 一个 qoute 在它的字符串中?一切都是 urlencoded 的吗?例如addslashes() ......或者它会破坏数组!
  • @user3351349 你少了一些逗号?
  • @user3351349 你在$available_brands_array 中的一个值不是字符串——它是someClassName 类型的一个类。使用print_r 并找出哪个,或使用以下内容:pastebin.com/XJHg8dpH

标签: php arrays limit implode


【解决方案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 />";
}
?>

【讨论】:

  • 同时检查数据库错误。您可能通过数组中不正确的某些数据创建了无效的 SQL。
猜你喜欢
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
相关资源
最近更新 更多