切片大数组:不能使用标量值作为数组

时间:2013-12-12 11:12:03

标签: php arrays

我正在创建一个批处理程序,可以定期从数据库中删除大量不必要的数据。

出于性能原因,我没有使用任何ORM,我只是:

  1. 在一个查询中从db获取所选记录的主键,
  2. 在下一个查询中删除它们。
  3. 问题在于有时会删除数百万条记录。所以我想在每个查询(delete from foo where id in(...))的1000个密钥的部分中删除它们。

    我试过了:

    $chunkSize = 1000;
    
    $ids = $mapper->getIdsForFoo(); //getting ids from db
    
        $idsCount = count($ids);
        if($idsCount && $ids != false){
    
          $chunks = ceil($idsCount / $chunkSize); //calculating chunks quantity      
          $chunksArr = array();
    
          //if there's more than 1000 ids, split them
          if($chunks > 1){
            for($i = 0; $i <= $chunks; $i++){
              $currentOffset = $i * $chunkSize;
              $chunks[] = \array_slice($idsCount, $currentOffset, $chunkSize);
            }
          }
          else{
            $chunksArr[] = $ids;
          }
    
          //deleting ids code here
        }
    

    不幸的是,我得到的结果是

    PHP Warning: Cannot use a scalar value as an array

    首先我认为这是因为我在array_slice()

    中进行了乘法运算
    $chunks[] = \array_slice($ids, $i * $chunkSize, $chunkSize);
    

    但是我把它提取到单独的变量

    $currentOffset = $i * $chunkSize;
    $chunks[] = \array_slice($ids, $currentOffset, $chunkSize);
    

    但我仍然得到同样的错误。

1 个答案:

答案 0 :(得分:1)

为什么不使用array_chunk?它完全符合您的要求:

$chunks = array_chunk($ids, 1000);

如果您不想要此解决方案,则您的示例不会声明$mailsIds。在顶部,它被称为$ids