合并PHP数组和嵌套关系

时间:2016-03-02 23:36:28

标签: javascript php arrays json array-merge

我在PHP中有两个数组,我需要传递给JS脚本。 PHP数组是locationsrooms,如下所示:

var_dump($ locations)

Array ( [0] => Array 
               ( [id] => 1
                 [name] => "London"  )
        [1] => Array 
               ( [id] => 2
                 [name] => "Manchester"  )
      )

var_dump($ rooms)

Array ( [0] => Array 
               ( [id] => 1
                 [locationId] => "1"
                 [name] => "Lon Room 1"  )
        [1] => Array 
               ( [id] => 2
                 [locationId] => "1"
                 [name] => "Lon Room 2"  )
        [2] => Array 
               ( [id] => 3
                 [locationId] => "1"
                 [name] => "Lon Room 3"  )
        [3] => Array 
               ( [id] => 4
                 [locationId] => "2"
                 [name] => "Man Room 1"  )
        [4] => Array 
               ( [id] => 5
                 [locationId] => "2"
                 [name] => "Man Room 2"  )
      )

我需要将rooms数组合并到位于其相应位置下的阵列分组房间,以便我能够将以下语法吐出到名为DailyPlot Scheduler的JS插件中。

{ name: "London", id: "1", children:[
         { name : "Lon Room 1", id : "1" },
         { name : "Lon Room 2", id : "2" },
         { name : "Lon Room 3", id : "3" }
         ] 
 },
 { name: "Manchester", id: "2", children:[
         { name : "Man Room 1", id : "1" },
         { name : "Man Room 2", id : "2" }
         ] 
 }

我在这里和那里学习了一些东西,作为我学徒期的一部分,但我不能很好地自己解决这个问题,但是对不起,谢谢你!

3 个答案:

答案 0 :(得分:2)

如果您创建一个按位置ID索引的数组,那么您可以使用索引为指定位置添加子项:

$locations_by_id = [];

foreach($locations as $location) {
    $location['children'] = []; //initialize children to an empty array
    $locations_by_id[$location['id']] = $location;
}

foreach($rooms as $room) {    
    //add room to location
    $locations_by_id[$room['locationId']]['children'][] = $room;
}

$locations = array_values($locations_by_id); //removes the id index

print json_encode($locations);

答案 1 :(得分:2)

我在你的一条评论中注意到你正在使用数据库,所以我决定继续添加一个答案。另一个选择是通过加入查询中的位置和房间来避免开始使用两个数组。我对表/列的名称做了一些假设,但像这样的查询应该有效:

SELECT l.id AS l_id, l.name AS l_name, r.id AS r_id, r.name AS r_name
FROM locations l LEFT JOIN rooms r ON l.id = r.locationId
ORDER BY l.id, r.id

然后,当您从结果中获取行时,可以使用位置ID作为键来构造数组。

while ($room = $query->fetch()) { // fetch method depends on what db extension you're using
    $rooms[$room['l_id']]['name'] = $room['l_name'];
    $rooms[$room['l_id']]['id'] = $room['l_id'];
    $rooms[$room['l_id']]['children'][] = array('name' => $room['r_name'], 
                                                'id'   => $room['r_id']);
}

echo json_encode(array_values($rooms));

答案 2 :(得分:1)

您可以创建一个包含所有id locations数组的数组,然后使用rooms将每个locations数组直接添加到array_search数组:< / p>

$index = array_column( $locations, 'id' );
foreach( $rooms as $key => $val )
{
    $found = array_search( $val['locationId'], $index );
    $locations[$found]['children'][] = array( 'name' => $val['name'], 'id' => $val['id'] );
}

$json = json_encode( $locations );

eval.in demo