【问题标题】:Rearranging multidimensional array in PHP [closed]在 PHP 中重新排列多维数组 [关闭]
【发布时间】:2012-05-09 11:40:30
【问题描述】:

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

【问题讨论】:

标签: php codeigniter multidimensional-array pyrocms


【解决方案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

将名称替换为变量名和键名。

【讨论】:

  • 我创建了一个函数:return array_values($reKeyed);所以它按正常顺序设置键。
  • 现在我需要让玩家加入!
  • 这里是工作代码theevilteddys.nl/rev91/server
【解决方案2】:

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

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

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

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

(以上代码未经测试)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多