如何使用PHP连接数组的相似元素

我们正在一个庞大的列表(包含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,3),而是决定使用array(1 => true,3 => true),因为使用键而不是值(用于存储信息)使下面的代码运行更快,并且如上所述输出$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;

                }

            }   

        }

    }

}

但是上面的代码仍然很慢。您能否找到一种更好的方法,以更快的代码将相似的元素彼此聚合?

jiayoushixin 回答:如何使用PHP连接数组的相似元素

如何使用array_intersect_key而不是第三循环?

$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)

);
foreach ($array as $key => $value) {
    foreach ($array as $key2 => $value2) {
        if ($key !== $key2 && !empty(array_intersect_key($value,$value2))) {
            $array[$key] = $value2 + $value;
            unset($array[$key2]);
        }
    }
}

print_r($array);

Working example

编辑#1: 为了获得更好的性能,请尝试以下变体:

$array = array(
    array(1 => true,300 => true)

);
$count = count($array);
for ($i = 0; $i < $count - 1; ++$i) {
    for ($j = $i + 1; $j < $count; ++$j) {
        if (!empty(array_intersect_key($array[$i],$array[$j]))) {
            $array[$j] = $array[$i] + $array[$j];
            unset($array[$i]);
            continue 2;
        }
    }
}

Working example #2

,
$arr = array('Hello','World!','Beautiful','Day!');
echo join(" ",$arr);

See Details

本文链接:https://www.f2er.com/3118310.html

大家都在问