3

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

2 回答 2

1

它的工作原理是这样的:

  1. 您可以通过它的数字 id 来识别每个节点,并将其存储在哈希中,以便可以通过它的 id 访问它。
  2. 您采用新的哈希并插入所有元素,包括。他们的孩子根据需要。

代码的详细讨论在这里: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

将名称替换为您所拥有的变量名称和键。

于 2012-05-10T09:13:17.383 回答
0

根据当前数组中的 pid 创建一个数组,您可以使用该数组根据 id 循环遍历子项。

$arr = array(...definition from your post....);
foreach($arr["teams"] as $team)
    $teamchildren[$team[pid]][]=$team;
print_r($teamchildren);

现在您可以遍历 $teamchildren[0] 数组并递归调用函数来构建每个团队下的嵌套团队结构

相同的概念可以应用于玩家,但在这种情况下将父级更改为cid

(以上代码未经测试)

于 2012-05-09T12:23:05.723 回答