我有一个数组,需要稍微重新排列一下。我正在为pyrocms构建语音服务器状态小部件。
- 我用于查询语音服务器的工具 -> https://github.com/Austinb/GameQ
- 我用于模板的工具 -> https://github.com/BorisMoore/jsrender
使用静态表格我创建了这个! www.i.stack.imgur.com/4a3Am.png
我得到了一个返回的数组,看起来是这样的:
Array (
"Ventrilo" => Array (
"name" => "The Evil Teddys",
"phonetic" => "The Evil Teddys",
"comment" => "",
"auth" => "1",
"maxclients" => "20",
"voicecodec" => "0,GSM 6.10",
"voiceformat" => "3,44 KHz, 16 bit",
"uptime" => "25799604",
"platform" => "Linux-i386",
"version" => "3.0.3",
"channelcount" => "7",
"teams" => Array (
"0" => Array (
"cid" => "846",
"pid" => "0",
"prot" => "0",
"name" => "<TET>",
"comm" => ""
),
"1" => Array (
"cid" => "847",
"pid" => "0",
"prot" => "0",
"name" => "#ISOLATIECEL",
"comm" => ""
),
"2" => Array (
"cid" => "848",
"pid" => "0",
"prot" => "0",
"name" => "Relax Take It Easy",
"comm" => ""
),
"3" => Array (
"cid" => "849",
"pid" => "846",
"prot" => "0",
"name" => "Foodfightkitchen",
"comm" => ""
),
"4" => Array (
"cid" => "850",
"pid" => "846",
"prot" => "0",
"name" => "WOW",
"comm" => ""
),
"5" => Array (
"cid" => "851",
"pid" => "849",
"prot" => "0",
"name" => "Bad Company",
"comm" => ""
),
"6" => Array(
"cid" => "852",
"pid" => "850",
"prot" => "0",
"name" => "The G Channel",
"comm" => ""
)
),
"clientcount" => "3",
"players" => Array (
"0" => Array (
"admin" => "1",
"cid" => "846",
"phan" => "0",
"ping" => "18",
"sec" => "345345",
"name" => "Shorty*",
"comm" => ""
),
"1" => Array (
"admin" => "1",
"cid" => "851",
"phan" => "0",
"ping" => "20",
"sec" => "11988",
"name" => "Swifty",
"comm" => ""
),
"2" => Array (
"admin" => "1",
"cid" => "846",
"phan" => "0",
"ping" => "30",
"sec" => "678674",
"name" => "The1one12",
"comm" => ""
)
),
"gq_online" => "0",
"gq_address" => "172.0.0.1",
"gq_port" => "3812",
"gq_prot" => "ventrilo",
"gq_type" => "ventrilo"
)
我希望我的最终结果是这样的:
cid = 频道ID
pid = 父级ID
Array (
"Ventrilo" => Array (
"name" => "The Evil Teddys",
"phonetic" => "The Evil Teddys",
"comment" => "",
"auth" => "1",
"maxclients" => "20",
"voicecodec" => "0,GSM 6.10",
"voiceformat" => "3,44 KHz, 16 bit",
"uptime" => "25799604",
"platform" => "Linux-i386",
"version" => "3.0.3",
"channelcount" => "7",
"teams" => Array (
"0" => Array (
"cid" => "846",
"pid" => "0",
"prot" => "0",
"name" => "<TET>",
"comm" => "",
"players" => Array (
"0" => Array (
"admin" => "1",
"cid" => "846",
"phan" => "0",
"ping" => "18",
"sec" => "345345",
"name" => "Shorty*",
"comm" => "vet verwacht je niet"
),
"1" => Array (
"admin" => "1",
"cid" => "846",
"phan" => "0",
"ping" => "30",
"sec" => "678674",
"name" => "The1one12",
"comm" => "grappig !"
)
),
"teams" => Array(
"0" => Array (
"cid" => "849",
"pid" => "846",
"prot" => "0",
"name" => "Foodfightkitchen",
"comm" => "",
"players" => Array (),
"teams" => Array(
"0" => Array (
"cid" => "851",
"pid" => "849",
"prot" => "0",
"name" => "Bad Company",
"comm" => "",
"players" => Array (
"0" => Array (
"admin" => "1",
"cid" => "851",
"phan" => "0",
"ping" => "20",
"sec" => "11988",
"name" => "Swifty",
"comm" => "nu nog Dynamisch"
)
),
"teams" => Array(
)
)
)
),
"1" => Array (
"cid" => "850",
"pid" => "846",
"prot" => "0",
"name" => "WOW",
"comm" => "",
"players" => Array (),
"teams" => Array(
"0" => Array(
"cid" => "852",
"pid" => "850",
"prot" => "0",
"name" => "The G Channel",
"comm" => "",
"players" => Array (),
"teams" => Array(
)
)
)
)
)
),
"1" => Array (
"cid" => "847",
"pid" => "0",
"prot" => "0",
"name" => "#ISOLATIECEL",
"players" => Array (),
"teams" => Array(
)
),
"2" => Array (
"cid" => "848",
"pid" => "0",
"prot" => "0",
"name" => "Relax Take It Easy",
"comm" => "",
"players" => Array (),
"teams" => Array(
)
)
),
"clientcount" => "3",
"gq_online" => "1",
"gq_address" => "213.163.76.130",
"gq_port" => "3812",
"gq_prot" => "ventrilo",
"gq_type" => "ventrilo"
)
我应该怎样做才能实现这个?我尝试了很多方法,但没有一个能够达到这个结果。
我目前拥有的是什么。
$teamArrayConverted['teams'] = convertTeamArray($serverstatus['teams']);
unset($serverstatus['players'], $serverstatus['teams']);
$results = array_merge_recursive($serverstatus, $teamArrayConverted);
function convertTeamArray ($array) {
// First, convert the array so that the keys match the ids
$reKeyed = array();
foreach ($array as $item) {
$reKeyed[(int) $item['cid']] = $item;
}
//print_r($reKeyed);
// Next, use references to associate children with parents
foreach ($reKeyed as $id => $item) {
if (isset($item['pid'], $reKeyed[(int) $item['pid']])) {
$reKeyed[(int) $item['pid']]['teams'][] =& $reKeyed[$id];
}
}
//print_r($reKeyed);
// Finally, go through and remove children from the outer level
foreach ($reKeyed as $id => $item) {
if ($item['pid'] != '0') {
//print_r($reKeyed[$id]);
unset($reKeyed[$id]);
}
}
return array_values($reKeyed);
}