【问题标题】:PHP Multidimensional Array Value ReplacementPHP多维数组值替换
【发布时间】:2014-06-27 20:34:11
【问题描述】:

我最近一直在做一个项目来玩。

它从游戏服务器检索 JSON,将其解码为数组,然后将数组值保存到 SQLite DB 中(以便稍后显示/操作)。总的来说,我是编程新手,在此之前从未接触过 PHP。

我的问题:有没有更好、更有效的方法来处理这个问题?

基本上,这部分代码循环遍历大型多维数组,并替换等于字符串的值。它在插入数据库之前执行此操作,以便我可以将字段格式化为更具可读性。

问题在于,在实际脚本中,我现在有一个巨大的已定义变量列表,例如 3 个 foreach 循环和大约 15 个 if/else if/else 语句的组合。

$sr = "Summoners Rift";
$rs = "Ranked Solo";
$rt = "Ranked Team";
$nr = "Normal";

foreach ($history['games'] as &$typeMode)
{
    if ($typeMode['subType'] == 'RANKED_SOLO_5x5')
    {
        $typeMode['gameMode'] = $sr;
        $typeMode['subType'] = $rs;
    }
    elseif ($typeMode['subType'] == 'RANKED_TEAM_5x5')
    {
        $typeMode['gameMode'] = $sr;
        $typeMode['subType'] = $rt;
    }
    elseif ($typeMode['subType'] == 'NORMAL')
    {
        $typeMode['gameMode'] = $sr;
        $typeMode['subType'] = $nr;
    }
}

【问题讨论】:

  • 您应该为初学者检查 php switch() 函数。大多数时候格式更简洁,速度更快。
  • 谢谢!我在下面的 cOle2 也用一个例子推荐了这个选项。这似乎是实现这一目标的更好方法。非常感谢。

标签: php arrays multidimensional-array foreach


【解决方案1】:

问题是在实际脚本中我有一个巨大的定义列表 现在的变量,就像 3 个 foreach 循环和 15 个左右的 IF / ELSEIF / ELSE 语句。

根据您所显示的数据,我可以推荐的最佳解决方案是创建一个连接到您拥有的数据的基本结构数组,然后使用 foreach 循环根据该初始数组结构分配值:

// Set structured array values.
$array_values = array();
$array_values['RANKED_SOLO_5x5']['gameMode'] = "Summoners Rift";
$array_values['RANKED_SOLO_5x5']['subType'] = "Ranked Solo";
$array_values['RANKED_TEAM_5x5']['gameMode'] = "Summoners Rift";
$array_values['RANKED_TEAM_5x5']['subType'] = "Ranked Team";
$array_values['NORMAL']['gameMode'] = "Summoners Rift";
$array_values['NORMAL']['subType'] = "Normal";

// Set structured array values based on the sub type.
foreach ($history['games'] as &$typeMode) {
   $typeMode['gameMode'] = $array_values[$typeMode['subType']]['gameMode'];
   $typeMode['subType'] = $array_values[$typeMode['subType']]['subType'];
}

这样$array_values 总是有预设值开始。而分配只是通过foreach 循环中$typeMode['subType'] 的数组键访问发生。

【讨论】:

  • 这是一个非常有趣的解决方案。我一直在使用从 JSON 解码到 DB 插入的相同数组来处理这个问题,但也许根据需要构建我自己的数组并从原始数组中插入适当的数据会更好。
  • @user3642863 乐于助人!一旦您了解了数组和键的交互方式,这可能会让您的生活更轻松。
【解决方案2】:

对于这样的事情,我更喜欢使用switch control structure 而不是if/elseif/else,尽管您的方法非常好,如果有点冗长:

foreach ($history['games'] as &$typeMode)
{
    $typeMode['gameMode'] = $sr;

    switch($typeMode['subType'])
    {
        case 'RANKED_SOLO_5x5':
            $typeMode['subType'] = $rs;
            break;
        case 'RANKED_TEAM_5x5':
            $typeMode['subType'] = $rt;
            break;
        case 'NORMAL':
            $typeMode['subType'] = $nr;
            break;
    }
}

另外,如果$typeMode['gameMode'] 始终等于$sr;,那么您只需要该行一次。

【讨论】:

  • 啊!谢谢你的回答。这看起来干净了很多。我根本不知道“开关”。 $typeMode['gameMode'] 可以是其他几个值,我只是省略了大部分代码。我想我可以在 subType 的开关之外为 gameMode 做一个开关。
猜你喜欢
  • 2016-09-26
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多