You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP从59元素数字数组生成10元素组合时触发内存溢出报错

59元素数组生成10长度组合的实现问题

基础需求

从包含59个数字的数组中获取所有长度为10的组合,示例原始数组定义为:

$array = [1,10,20,32,12,60,54,90,20,11,2,3,4,5,6,7,8,9,22,33,61,62,69,49, ...];

已尝试的实现方案

类内递归采样实现

对应方法代码:

function sampling($chars, $size = 10, $combinations = array()) {
    // 首次迭代时,初始组合集与字符集保持一致
    if (empty($combinations)) {
        $combinations = $chars;
    }

    // 当递归到size为1时返回结果
    if ($size == 1) {
        return $combinations;
    }

    // 初始化数组存储新生成的组合
    $new_combinations = array();

    // 遍历已有组合与字符集拼接生成新字符串
    foreach ($combinations as $combination) {
        foreach ($chars as $char) {
            $tmp = $combination . $char;
            if ($size == 2) {
                $tmp .= '.com';
            }
            $new_combinations[] = $tmp;
            // 逻辑存在缺陷的注释代码
            //$new_combinations[] = implode(".com", $new_combinations);
        }
    }

    // 递归调用自身进入下一层迭代
    return $this->sampling($chars, $size - 1, $new_combinations);
}

该实现无重复选取限制、无组合去重逻辑,递归生成的结果规模会随层级指数级膨胀。

Math_Combinatorics 库实现

对应调用代码:

require_once 'Math/Combinatorics.php';
$numbers = [1,10,20,32,12,60,54,90,20,11,2,3,4,5,6,7,8,9,22,33,61,62,69,49, ...];
$combinatorics = new Math_Combinatorics;
foreach($combinatorics->permutations($numbers, 10) as $p) {
  echo join(' ', $p), "\n"; 
}

运行报错:Fatal error: Out of memory (allocated 20061356032) (tried to allocate 20480 bytes)
该方法调用的是排列生成逻辑,对应计算规模为59个元素中取10个的全排列量级,无内存优化的批量结果加载会直接耗尽可用内存。

已完成的内存配置调整

  • 修改php.ini全局配置:memory_limit=-1
  • 脚本内动态覆盖配置:ini_set("memory_limit", "-1");

补充说明

因采样方法定义在类内部,递归调用时统一使用$this->sampling的写法。


内容的提问来源于stack exchange,提问作者Simone Rossaini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 01:36:02