代码之家  ›  专栏  ›  技术社区  ›  Anwar

性能阵列连接?

  •  1
  • Anwar  · 技术社区  · 7 年前

    我想将相同的概念应用于 关联数组数组 而不是SQL。下面是用户及其地址的示例,下面是调用 array_join(array $array1, array $array2, string $key1, string $key2, string $new_key)

    用户

    Array
    (
        [0] => Array
            (
                [id] => 1
                [name] => John
            )
    
        [1] => Array
            (
                [id] => 2
                [name] => Foo
            )
    
        [2] => Array
            (
                [id] => 3
                [name] => Baz
            )
    
    )
    

    地址:

    Array
    (
        [0] => Array
            (
                [id] => 1
                [user_id] => 1
                [street] => 53 Van Ness St
            )
    
        [1] => Array
            (
                [id] => 2
                [user_id] => 1
                [street] => 21 Overland St
            )
    
        [2] => Array
            (
                [id] => 3
                [user_id] => 1
                [street] => 101 Mountfort St
            )
    
        [3] => Array
            (
                [id] => 4
                [user_id] => 3
                [street] => 27 Sidney St
            )
    
    )
    

    (总之,用户1有3个地址,用户3有一个地址)

    所需输出

    Array
    (
        [0] => Array
            (
                [id] => 1
                [name] => John
                [addresses] => Array
                    (
                        [0] => Array
                            (
                                [id] => 1
                                [user_id] => 1
                                [street] => 53 Van Ness St
                            )
    
                        [1] => Array
                            (
                                [id] => 2
                                [user_id] => 1
                                [street] => 21 Overland St
                            )
    
                        [2] => Array
                            (
                                [id] => 3
                                [user_id] => 1
                                [street] => 101 Mountfort St
                            )
    
                    )
    
            )
    
        [1] => Array
            (
                [id] => 2
                [name] => Foo
            )
    
        [2] => Array
            (
                [id] => 3
                [name] => Baz
                [addresses] => Array
                    (
                        [0] => Array
                            (
                                [id] => 4
                                [user_id] => 3
                                [street] => 27 Sidney St
                            )
    
                    )
    
            )
    
    )
    

    现在我想到的是:

    <?php
    
    function array_join(&$array1, $array2, $key1, $key2, $new_key) {
        foreach( $array1 as $index1 => $row1 ) {
            foreach( $array2 as $index2 => $row2 ) {
                if( $row2[$key2] === $row1[$key1] ) {
                    $array1[$index1][$new_key][] = $row2;
                }
            }
        }
    }
    

    知道此函数平均需要1.2秒的时间,如何使其计算数据更快。,这对于6000行来说非常高。。。我怎样才能优化它呢?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Barmar    7 年前

    不要使用嵌套循环。创建使用 $key1 作为钥匙。然后你就可以循环通过 $array2 并找到匹配的元素 $array1 没有循环。

    function array_join(&$array1, $array2, $key1, $key2, $new_key) {
        $assoc_array1 = array();
        // Create an associative array of references to the original array elements, keyed by $key1
        foreach ($array1 as &$row1) {
            $assoc_array1[$row1[$key1]] = $row1;
        }
        // Join the elements of the second array to those elements.
        foreach( $array2 as $row2 ) {
            $assoc_array1[$row2[$key2]][$new_key][] = $row2;
        }
    }
    

    这类似于数据库使用索引进行优化的方式 JOIN 操作。