我有两个数组,如:
$team = [
['id' => 1, 'name' => 'Team A'],
['id' => 2, 'name' => 'Team B'],
['id' => 3, 'name' => 'Team C'],
];
$people = [
['id' => 1, 'name' => 'Mark Hamill', 'team' => 1],
['id' => 2, 'name' => 'Nicolas Cage', 'team' => 2],
['id' => 3, 'name' => 'Tom Cruise', 'team' => 3],
['id' => 4, 'name' => 'Tom Hanks', 'team' => 1],
['id' => 5, 'name' => 'Brad Pitt', 'team' => 2],
['id' => 6, 'name' => 'Paul Smith', 'team' => 3],
['id' => 7, 'name' => 'Matt Daemon', 'team' => 1],
['id' => 8, 'name' => 'Robert Redford', 'team' => 2],
]
我想根据团队ID将$ people数组合并为$ team数组作为子节点。因此结果将是:
$team = [
[
'id' => 1,
'name' =>'Team A',
'members' => [
['id' => 1, 'name' => 'Mark Hamill', 'team' => 1],
['id' => 4, 'name' => 'Tom Hanks', 'team' => 1],
['id' => 7, 'name' => 'Matt Daemon', 'team' => 1],
]
],
[
'id' => 2,
'name' =>'Team B',
'members' => [
['id' => 2, 'name' => 'Nicolas Cage', 'team' => 2],
['id' => 5, 'name' => 'Brad Pitt', 'team' => 2],
['id' => 8, 'name' => 'Robert Redford', 'team' => 2],
]
],
[
'id' => 3,
'name' =>'Team C',
'members' => [
['id' => 3, 'name' => 'Tom Cruise', 'team' => 3],
['id' => 6, 'name' => 'Paul Smith', 'team' => 3],
]
],
];
我知道我可以遍历$ team并根据他们的“ team” ID一次添加一个相关的$ people,但是我想知道是否有更有效的方法。在我的项目中,这两个数组中的每个数组都可以增长到最多包含约50个项目,并且一次处理这些数组确实使页面速度变慢。
谢谢
答案 0 :(得分:4)
这将循环$ teams数组并与array_column相交以获得所需的数组。
$teampeople = array_column($people, "team");
//Creates a lookup array of the teams from people array
foreach($team as &$t){
// Here I match from the lookup array and get the "main" arrays.
// Array_values remove the indexed from the resulting array to make it 0,1,2 etc.
$t['members'] = array_values(array_intersect_key($people, array_intersect($teampeople, [$t['id']])));
}
unset($t); // just to make sure you don't accidentally change the array
var_dump($team);
输出:
array(3) {
[0]=>
array(3) {
["id"]=>
int(1)
["name"]=>
string(6) "Team A"
["members"]=>
array(3) {
[0]=>
array(3) {
["id"]=>
int(1)
["name"]=>
string(11) "Mark Hamill"
["team"]=>
int(1)
}
[1]=>
array(3) {
["id"]=>
int(4)
["name"]=>
string(9) "Tom Hanks"
["team"]=>
int(1)
}
[2]=>
array(3) {
["id"]=>
int(7)
["name"]=>
string(11) "Matt Daemon"
["team"]=>
int(1)
}
}
}
[1]=>
array(3) {
["id"]=>
int(2)
["name"]=>
string(6) "Team B"
["members"]=>
array(3) {
[0]=>
array(3) {
["id"]=>
int(2)
["name"]=>
string(12) "Nicolas Cage"
["team"]=>
int(2)
}
[1]=>
array(3) {
["id"]=>
int(5)
["name"]=>
string(9) "Brad Pitt"
["team"]=>
int(2)
}
[2]=>
array(3) {
["id"]=>
int(8)
["name"]=>
string(14) "Robert Redford"
["team"]=>
int(2)
}
}
}
[2]=>
&array(3) {
["id"]=>
int(3)
["name"]=>
string(6) "Team C"
["members"]=>
array(2) {
[0]=>
array(3) {
["id"]=>
int(3)
["name"]=>
string(10) "Tom Cruise"
["team"]=>
int(3)
}
[1]=>
array(3) {
["id"]=>
int(6)
["name"]=>
string(10) "Paul Smith"
["team"]=>
int(3)
}
}
}
}
答案 1 :(得分:0)
尝试一下:
foreach ($team as $t) {
$t['members'] = array_filter($people, function ($var) use ($t) {
return ($var['team'] == $t['id']);
})
}