【问题标题】:Access certain array that has a certain value in it's name [duplicate]访问名称中具有特定值的特定数组[重复]
【发布时间】:2014-08-14 04:27:08
【问题描述】:

我正在尝试制作一个 html Sudoku 游戏板,它根据 php $_GET['level']$_GET['puzzle'] 值加载不同的谜题。 PHP 变量 $get_level$get_puzzle 设置为 $_GET 值,因此它们可以在 javascript 中使用。

<?php
$default_level = 'medium';
$default_puzzle = 1;
$number_of_puzzles_per_level = 10;
if (isset($_GET['level']) && isset($_GET['puzzle'])) {
    if ($_GET['level'] == 'easy' || $_GET['level'] == 'medium' || $_GET['level'] == 'hard') {
        $get_level = $_GET['level'];
    } else {
        $get_level = $default_level;
    }
    if (is_int($_GET['puzzle'])) {
        if ($_GET['puzzle'] > 0 && $_GET['puzzle'] <= $number_of_puzzles_per_level) {
            $get_puzzle = $_GET['puzzle'];
        } else {
            $get_puzzle = $default_puzzle;
        }
    } else {
        $get_puzzle = $default_puzzle;
    }
} else {
    $get_level = $default_level;
    $get_puzzle = $default_puzzle;
}
?>

在 javascript 中,我有一堆数组:

level_easy_puzzle_1 = [[0, 0, 0, 7, 0, 3, 0, 0, 0], [0, 2, 3, 5, 0, 0, 0, 0, 3], [0, 0, 0, 0, 4, 0, 0, 0, 9], [1, 0, 7, 0, 0, 0, 0, 4, 0], [0, 4, 0, 3, 0, 9, 0, 8, 0], [0, 8, 0, 0, 0, 0, 5, 0, 1], [7, 0, 0, 0, 6, 0, 0, 0, 0], [8, 0, 0, 0, 0, 1, 2, 5, 0], [0, 0, 0, 2, 0, 4, 0, 0, 0]];
//I will fill out the rest of the puzzles later
level_easy_puzzle_2 = [[], [], [], [], [], [], [], [], []];
level_easy_puzzle_3 = [[], [], [], [], [], [], [], [], []];
level_easy_puzzle_4 = [[], [], [], [], [], [], [], [], []];
level_easy_puzzle_5 = [[], [], [], [], [], [], [], [], []];
level_easy_puzzle_6 = [[], [], [], [], [], [], [], [], []];
level_easy_puzzle_7 = [[], [], [], [], [], [], [], [], []];
level_easy_puzzle_8 = [[], [], [], [], [], [], [], [], []];
level_easy_puzzle_9 = [[], [], [], [], [], [], [], [], []];
level_easy_puzzle_10 = [[], [], [], [], [], [], [], [], []];
level_medium_puzzle_1 = [[], [], [], [], [], [], [], [], []];
level_medium_puzzle_2 = [[], [], [], [], [], [], [], [], []];
level_medium_puzzle_3 = [[], [], [], [], [], [], [], [], []];
level_medium_puzzle_4 = [[], [], [], [], [], [], [], [], []];
level_medium_puzzle_5 = [[], [], [], [], [], [], [], [], []];
level_medium_puzzle_6 = [[], [], [], [], [], [], [], [], []];
level_medium_puzzle_7 = [[], [], [], [], [], [], [], [], []];
level_medium_puzzle_8 = [[], [], [], [], [], [], [], [], []];
level_medium_puzzle_9 = [[], [], [], [], [], [], [], [], []];
level_medium_puzzle_10 = [[], [], [], [], [], [], [], [], []];
level_hard_puzzle_1 = [[], [], [], [], [], [], [], [], []];
level_hard_puzzle_2 = [[], [], [], [], [], [], [], [], []];
level_hard_puzzle_3 = [[], [], [], [], [], [], [], [], []];
level_hard_puzzle_4 = [[], [], [], [], [], [], [], [], []];
level_hard_puzzle_5 = [[], [], [], [], [], [], [], [], []];
level_hard_puzzle_6 = [[], [], [], [], [], [], [], [], []];
level_hard_puzzle_7 = [[], [], [], [], [], [], [], [], []];
level_hard_puzzle_8 = [[], [], [], [], [], [], [], [], []];
level_hard_puzzle_9 = [[], [], [], [], [], [], [], [], []];
level_hard_puzzle_10 = [[], [], [], [], [], [], [], [], []];

然后,我希望将 javascript 变量 puzzle 设置为上面的拼图数组之一,具体取决于以下变量 get_levelget_puzzle 的值。

var get_level = '<?php echo $get_level; ?>';
var get_puzzle = <?php echo $get_puzzle; ?>;

所以,如果get_level 等于'hard' 并且get_puzzle 等于3,我希望变量puzzle 等于数组level_hard_puzzle_3 的内容。

//Here's what I have right now, but it only gives me the name of the array not the contents
var puzzle = 'level_'+get_level+'_puzzle_'+get_puzzle;

希望很清楚我想要什么,感谢您的帮助。

【问题讨论】:

  • 要使用动态变量名,您必须使用 evalFunction 构造函数,两者都不是特别喜欢。通常的最佳解决方案是使用对象属性和方括号表示法进行访问,例如:var puzzle = {}; puzzel['level_'+get_level+'_puzzle_'+get_puzzle] = somevalule;

标签: javascript php arrays variables


【解决方案1】:

您可以使用eval Javascript 函数。

var puzzle = eval('level_' + get_level + '_puzzle_' + get_puzzle);

这会给你你的难题。

【讨论】:

  • 我会回来试试你的答案
  • 使用 eval 并不是一个特别好的答案,它是 javascript 的 GOTO。如果变量是全局变量,则首选windw['level_' + get_level + '_puzzle_' + get_puzzle],或者更好的是对象属性。
  • @RobG 我个人不想提倡eval,但从 OP 提出问题的方式来看,这似乎是唯一的答案。我个人更喜欢乍得的答案(上图),但是(严格来说)它确实将问题修改为答案。此外,通常不鼓励使用全局变量,并且使用对象属性可能会迫使您修改问题。
  • @boboman13:OP 不是有机编程的意思吗?我查了一下,不明白是什么意思
  • @codeshackel OP 表示原始海报。不错的选择,反正我更喜欢乍得的回答。
【解决方案2】:

您可以将其组织成一个对象。此外,让数组索引处理您的编号,而不是将数字分配给变量名称。 (如果您决定移除一个谜题,则必须重命名所有谜题。)

var puzzles = {
    easy: [
            [//Puzzle 0
              [0, 0, 0, 7, 0, 3, 0, 0, 0],
              [0, 2, 3, 5, 0, 0, 0, 0, 3],
              [0, 0, 0, 0, 4, 0, 0, 0, 9],
              [1, 0, 7, 0, 0, 0, 0, 4, 0],
              [0, 4, 0, 3, 0, 9, 0, 8, 0],
              [0, 8, 0, 0, 0, 0, 5, 0, 1],
              [7, 0, 0, 0, 6, 0, 0, 0, 0],
              [8, 0, 0, 0, 0, 1, 2, 5, 0],
              [0, 0, 0, 2, 0, 4, 0, 0, 0]
            ],
            [//Puzzle 1
              [0, 0, 0, 7, 0, 3, 0, 0, 0],
              [0, 2, 3, 5, 0, 0, 0, 0, 3],
              [0, 0, 0, 0, 4, 0, 0, 0, 9],
              [1, 0, 7, 0, 0, 0, 0, 4, 0],
              [0, 4, 0, 3, 0, 9, 0, 8, 0],
              [0, 8, 0, 0, 0, 0, 5, 0, 1],
              [7, 0, 0, 0, 6, 0, 0, 0, 0],
              [8, 0, 0, 0, 0, 1, 2, 5, 0],
              [0, 0, 0, 2, 0, 4, 0, 0, 0]
            ]
    ], //end of the easy puzzles
    medium: [], //...and so on...
    hard: [],
}

我建议制作一个检索谜题的函数,这样你就可以在一个地方巧妙地控制你的逻辑:

function getPuzzle(difficulty, level){
    if(puzzles[difficulty] && puzzles[difficulty].length >= level -1){
        return puzzles[difficulty][level];
    }else{
        console.warn("That puzzle doesn't exist!");
        return;
    }
}

我们现在可以做类似var puzzle = getPuzzle('hard', 2) 的事情,但让我们在此基础上创建一个可以得到随机谜题的函数。

function getRandomPuzzle(level) {
  return getPuzzle(level, Math.floor(Math.random() * (puzzles[level].length)));
}

var puzzle = getRandomPuzzle('hard');

【讨论】:

    猜你喜欢
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 2017-11-21
    • 2016-02-16
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多