我有一个我需要重新排列的数组。 我正在为pyrocms构建语音服务器状态小部件。
使用我创建的静态表格! 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);
}
答案 0 :(得分:1)
原则上这样工作:
详细讨论代码在这里:Converting an array from one to multi-dimensional based on parent ID values:
// key the array by id
$keyed = array();
foreach($array as &$value)
{
$keyed[$value['id']] = &$value;
}
unset($value);
$array = $keyed;
unset($keyed);
// tree it
$tree = array();
foreach($array as &$value)
{
if ($parent = $value['parent_id'])
$array[$parent]['children'][] = &$value;
else
$tree[] = &$value;
}
unset($value);
$array = $tree;
unset($tree);
var_dump($array); # your result
将名称替换为变量名称和键的名称。
答案 1 :(得分:0)
根据当前数组中的pid创建一个数组,您可以使用该数组根据id循环遍历子项。
$arr = array(...definition from your post....);
foreach($arr["teams"] as $team)
$teamchildren[$team[pid]][]=$team;
print_r($teamchildren);
现在你可以遍历$ teamchildren [0]数组并递归调用一个函数来构建每个团队下的嵌套团队结构
相同的概念可以应用于玩家,但在这种情况下将父母更改为cid
(以上代码未经过测试)