Php 性能数组连接?
我希望将相同的概念应用于关联数组的数组,而不是SQL中的数组。下面是用户及其地址的示例,下面是名为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 )
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)。