PHP使用array_replace处理多维数组

3
我正在尝试构建一个8x8的游戏棋盘,用于进行小型战舰游戏,类似于跳棋。我可以使用MySQL来移动游戏棋子,玩家可以在棋盘上自由移动,以对抗彼此的战舰。
这些棋子将放置在预定的空间中,而其他空间将为空,并由MySQL处理。
$pieces = array(
          //battleship 1 player 1
          "b1" => '<img src="images/b1.jpg" width="100" height="100" alt="b1">',
          //battleship 2 player2
          "b2" => '<img src="images/b1.jpg" width="100" height="100" alt="b1">',
         );
              // 'es' represents empty squares
$board = array(
         array('b1','es','b1','es','b1','es','b1','es'),
         array('es','b1','es','b1','es','b1','es','b1'),
         array('b1','es','b1','es','b1','es','b1','es'),
         array('es','es','es','es','es','es','es','es'),
         array('es','es','es','es','es','es','es','es'),
         array('es','es','es','es','es','es','es','es'),
         array('b2','es','b2','es','b2','es','b2','es'),
         array('es','b2','es','b2','es','b2','es','b2'),
         array('b2','es','b2','es','b2','es','b2','es')
      );

我已经有一个循环来显示棋盘,我的问题是如何放置 ($piece -> $board)。我知道可以使用 array_replace 将数组的元素放置到另一个数组中,但我不知道如何在多维数组中使用。

我还尝试在棋盘内使用 mysql 进行移动。


array_replace 在这里不会有用,它的功能与您想象的不同。最好使用 array_map,但如果您使用的是 PHP < 5.3,则很难将 $pieces 数组传递到回调函数中。 - Felix Kling
1个回答

6
如果您使用的是 PHP >= 5.3,您可以使用 array_map
$callback = function($value) use ($pieces) {
    if(array_key_exists($value, $pieces)) {
        return $pieces[$value];
    }
    return $value;
}

foreach($board as &$row) {
    $row = array_map($row, $callback);
}

如果您使用 PHP < 5.3,您可以使用array_walk_recursive函数:
function map(&$value, $key, $map) {
    if(array_key_exists($value, $map)) {
        $value = $map[$value];
    }
}

array_walk_recursive($board, 'map', $pieces);

如果不使用PHP 5.3版本,两种情况下的代码都会更短 ;)

更新:

这里有演示 :)


@Felix Kling我所要做的就是将其放入PHP中,那就完成了。 - hgbso
@hgbso:不确定我是否理解了你的问题,但$board$pieces将是你示例中的两个数组。你必须将它们传递给array_walk_recursive函数。 - Felix Kling
抱歉,我应该将该函数放在数组 $board $pieces 之后吗? - hgbso
@hgbso:就像任何函数一样,只有在之前定义了 $board$pieces,你才能调用 array_walk_recursive($board, 'map', $pieces);。函数 function map(){} 可以是在其他地方。 - Felix Kling
@hgbso:这里有另一个例子,如果你想打印行和列标题:http://codepad.org/kmZvN1zR 不确定你所说的“使用mysql在棋盘上移动”的意思。我认为你需要解释一下你的整个应用程序应该如何工作,但这将是一个新问题。 - Felix Kling
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接