之前在网上找到一个大牛写的版本(网址已经记不得了。。),如下

  

 function Descartes1()
{ //Cartesian product of arrays or strings or something else except empty array
//note that when there is only one argent, it must be an array with more than one elements, otherwise it will result in an warning and wrong result
$t = func_get_args(); if(func_num_args() == 1) return call_user_func_array( __FUNCTION__, $t[0] ); $a = array_shift($t); if(! is_array($a)) $a = array($a); $a = array_chunk($a, 1); do {
$r = array();
$b = array_shift($t);
if(! is_array($b)) $b = array($b); foreach($a as $p)
foreach(array_chunk($b, 1) as $q)
$r[] = array_merge($p, $q); $a = $r; }while($t); return $r;
}

Descartes1

  在实际使用过程中,若输入的 数组过大,则会导致内存不够用,于是 就将其改为了 yield 版本,如下:

     function Descartes()
{
$args = func_get_args();
if (func_num_args() == 1 && is_array($args[0])) $args=$args[0]; $i = 0;
$args_len = []; while ($i < count($args)){//modify each argument to array
$args_len[] = is_array($args[$i]) ? ( count($args[$i++]) - 1 ) : (int) ( ($args[$i] = array($args[$i])) && ++$i ) - 1;
#$args_len[] = is_array($args[$i]) ? count($args[$i])-1 : 0;
#$i++;
} foreach(Descartes_yield($args_len, $args) as $e){
yield $e;
}
}
function Descartes_yield($arr_len, $arr_data)
{
$len = count($arr_len);
$temp_arr = array_pad(array(), $len, 0);
$temp_arr[0]--; while($temp_arr != $arr_len) {
$temp_arr[0]++; $i = 0;
$result = []; while ($i < $len) {
if ($temp_arr[$i] > $arr_len[$i]) {
$temp_arr[$i] = 0;
$temp_arr[$i+1]++;
}
$i++;
}
$i=0;
while($i < $len) {
$result[$i] = $arr_data[$i][$temp_arr[$i]];
$i++;
} yield $result;
}
}

  下面是测试代码:

#Descartes(array(1,2),["a","b"],3);
 # 测试代码:
 # foreach ( Descartes( array(1,2), ["a","b"], 3) as $descar )
 #  print_r( $descar );

  不知道 速度 会不会比之前的慢,不过至少在 大量数据 做笛卡儿积的时候,可以跑起来了~

  又看到一个写的特别棒的,原文网址https://skyverd.com/php_array_function_cartesian/,如下:

 $arr = array(
array("a","b"),
range(1,100),
array("A","B","C")
);
6
7
8
fun($arr);
print_r($res); function fun($arr, $tmp = array())
{
foreach(array_shift($arr) as $v)
{
$tmp[] = $v;
if($arr)
{
fun($arr, $tmp);
}
else
{
$GLOBALS["res"][] = implode(",", $tmp); }
array_pop($tmp);
}
}

简单的测试了一下:

//memory_limit = 512M, 64位
range(1,10000000);//7个零,只有该数组时,php直接报错 $arr = array(
array("a","b"),
range(1,100000), // 5个零
array("A","B","C")
);//三个版本都正常运行 $arr1 = array(
array("a","b"),
range(1,1000000), // 6个零
array("A","B","C")
);//版本1,3直接报错,内存不够,版本2运行良好

最新文章

  1. 手动添加kdump
  2. spring与mybatis三种整合方法
  3. light oj 1047 - Neighbor House 动态规划
  4. lucene入门
  5. Ibatis对日期的处理
  6. 线段覆盖4(codevs 3012)
  7. windows下mysql5.7安装及配置
  8. 『零行代码』解决键盘遮挡问题(iOS)
  9. Nutch搜索引擎Solr简介及安装
  10. Concepts and Tricks In CNN
  11. [前言] 实现一个Android电子书阅读APP
  12. Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护
  13. Codeforces548A:Mike and Fax
  14. 「mysql优化专题」你们要的多表查询优化来啦!请查收(4)
  15. Linux入门总结——虚拟机安装配置以及vim简单操作
  16. PDF 补丁丁 0.6.1.3498 版重大更新:为文本PDF文档自动生成书签!
  17. es6 语法 (let 和const)
  18. linux下查询java进程以及杀掉其进程
  19. leetCode27.移除元素
  20. ubuntu查看文件和文件夹大小

热门文章

  1. 伪静态重写模块rewrite.dll及httpd.ini文件参考下载
  2. spider_jpg
  3. Eclipse - 修改默认user和类的创建日期
  4. 配置DelegatingFilterProxy使用Spring管理filter chain
  5. Also unsere eigene Christian Louboutin Webshop bietet die &#252;berragende Christian Louboutin Schuhe uk schiebt zusammen mit kosteng&#252;nstigen Wert
  6. Log4j 用法
  7. 初学者的python学习笔记2
  8. JS中的属性和变量的区别
  9. spring注解说明之Spring2.5 注解介绍(3.0通用)
  10. [Python学习笔记1]Python语言基础 数学运算符 字符串 列表