【发布时间】:2019-11-12 10:18:30
【问题描述】:
我们正在一个巨大的列表(包含 500 万个元素的数组)上运行 PHP 代码。
列表格式如下(乍一看很“奇怪”,但这是迄今为止我们为了优化下面代码的速度而推出的最好的格式)
$array = array(
array(1 => true,3 => true),
array(2 => true,4 => true,6 => true),
array(3 => true,5 => true),
array(5 => true),
array(4 => true,8 => true,10 => true),
array(200 => true,300 => true)
);
我们想将上面数组中相似的元素组合起来得到这样的结果:
$final_array = array(
array(1,3,5),
array(2,4,6,8,10),
array(200,300)
);
我们决定使用array(1 => true,3 => true),而不是使用array(1,3),因为使用键而不是值(用于存储信息)使下面的代码运行得更快,并且它输出$final_array 和上面一样。
foreach ($array as $key1 => $value1) {
foreach ($array as $key2 => $value2) {
if ($key1 != $key2) {
foreach ($array[$key1] as $key3 => $value3) {
if (isset($array[$key2][$key3])) {
$array[$key2] = $array[$key2] + $array[$key1];
unset($array[$key1]);
break 2;
}
}
}
}
}
但是上面的代码仍然很慢。您能找到一种更好的方法,以更快的代码将相似的元素相互聚合吗?
【问题讨论】:
-
你想达到什么目的?
-
@YasinPatel 我们希望将数组中相似的元素连接在一起,这些元素是分开的。例如:如果有一个元素包含 1,2,另一个元素包含 2,4,我们希望将它们全部连接起来,然后将 1,2,4 放在一个最终数组中。
-
真的不清楚为什么 1,3,5 相似但 2,4,6,8,10 不相似。但它们彼此相似。相似是指奇数和偶数吗?
-
或者你的意思是你想摆脱重复?
-
@RiggsFolly 让我澄清一下:如果一个元素有 1,2 而另一个元素有 2,4,那么这两个元素之间有一个“链接”,即数字 2。如果 1 和 2 在一起如果 2 和 4 在一起,那么 1 和 4 必须和 2 在一起。我找不到更好的英语表达方式抱歉。
标签: php arrays performance recursion