Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 性能数组连接?_Php_Arrays - Fatal编程技术网

Php 性能数组连接?

Php 性能数组连接?,php,arrays,Php,Arrays,我希望将相同的概念应用于关联数组的数组,而不是SQL中的数组。下面是用户及其地址的示例,下面是名为array\u join(array$array1、array$array2、string$key1、string$key2、string$new\u key)的函数的所需输出。 用户 Array ( [0] => Array ( [id] => 1 [name] => John )

我希望将相同的概念应用于关联数组的数组,而不是SQL中的数组。下面是用户及其地址的示例,下面是名为
array\u join(array$array1、array$array2、string$key1、string$key2、string$new\u 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
        )

)
地址

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;
            }
        }
    }
}

不要使用嵌套循环。创建使用
$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;
    }
}

这类似于数据库使用索引优化加入操作的方式。

至少按用户id分组地址,然后向用户添加组。您是如何获得1.2s的?示例数组非常长,两个循环只有可计数的时间<代码>$t1=微时间();foreach和foreach$diff=微时间()-$t1;echo$diff
。你是这样计算时间的吗?这个PHP的计时时间是1.2秒吗?或者查询?如果这些是数据库中的行-使用
JOIN
移动到查询,而不是2个查询和进一步处理。你听说过列别名吗?可能是
array\u column
来索引。@abracdaver我想要一个引用数组,以便在第二个循环中更新它们。真是太棒了!从平均值
1.2
变为
0.0019682248434331
!!谢谢。现在有趣的部分:理解!索引的使用非常巧妙,因为我只使用它来索引我的循环,您使用它作为锚点来避免交叉连接数组,非常好!每当您发现自己在使用嵌套循环(或调用函数的循环,如
in\u array()
array\u search()
,这些函数必须在内部使用循环)时,您都应该寻找解决方法。嵌套循环是O(n^2)。