在PHP中重新排列多维数组

时间:2012-05-09 11:40:31

标签: php codeigniter multidimensional-array pyrocms

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

2 个答案:

答案 0 :(得分:1)

原则上这样工作:

  1. 您可以通过它的数字ID识别每个节点,并将其存储在哈希中,以便可以通过它的ID进行访问。
  2. 你接受一个新的哈希并插入所有元素包括。他们的孩子视需要。
  3. 详细讨论代码在这里: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

(以上代码未经过测试)