如果下一个条目为整数,则在数组中应用Php函数(连接有效的FEN字符串)

问题描述 投票:0回答:1

试图建立有效的FEN string

给出这个8 * 8数组示例,表示一个棋盘格,(“ 1”为空正方形):

$checkerboard = [["r","n","b","q","k","b","n","r"],["p","p","p","p","p","p","p","p"],["1","1","1","1","1","1","1","1"],["1","1","1","1","1","1","1","1"],["1","1","1","1","P","1","1","1"],["1","1","1","1","1","1","1","1"],["P","P","P","P","1","P","P","P"],["R","N","B","Q","K","B","N","R"]]

原位,这是位置:

enter image description here

我正在寻找的有效结果是:

rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR

现在我的输出是:

rnbqkbnr/pppppppp/11111111/11111111/1111P111/11111111/PPPP1PPP/RNBQKBNR

很显然,只有当下一个条目是整数时,数组中的任何整数条目才应加到下一个整数;如果是,则应丢弃下一个条目直到结尾

通过迭代数组,我不确定如何在此处简单地应用array_walk()array_map()之类的内容。也许一个简单的字符串操作就足够了?

  $FEN = "";
  for ($i = 0;$i < 8;$i++){
    for ($j = 0;$j < 8;$j++){
      if ($checkerboard[$i][$j] === "1"){
        if ($checkerboard[$i][$j + 1] === "1"){
           /* How to iterate till the end */
           $FEN .= (int)$checkerboard[$i][$j] + (int)$checkerboard[$i][$j+1];
        }
      } else {
        $FEN .= $checkerboard[$i][$j];
      }      
    }
    $FEN .= "/";
  }

任何见解?

在线示例: https://3v4l.org/tuqqo

php multidimensional-array chess
1个回答
2
投票
$checkerboard = [["r","n","b","q","k","b","n","r"],["p","p","p","p","p","p","p","p"],["1","1","1","1","1","1","1","1"],["1","1","1","1","1","1","1","1"],["1","1","1","1","P","1","1","1"],["1","1","1","1","1","1","1","1"],["P","P","P","P","1","P","P","P"],["R","N","B","Q","K","B","N","R"]]; $parts = array(); foreach ($checkerboard as $innerArray) { $num = null; $str = ''; foreach($innerArray as $innerval){ if(is_numeric($innerval)){ $num += (int) $innerval; } else{ if(!is_null($num)){ $str .=$num; $num = null; } $str .=$innerval; } } if(!is_null($num)){ $str .=$num; } array_push($parts,$str); } $result = implode('/',$parts);
以上代码将生成所需的输出并将其存储在$ result中。
© www.soinside.com 2019 - 2024. All rights reserved.