我有一个需要重新排列的数组。我正在为 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);
}