Php применить функцию в массиве, если следующая запись целочисленная (объединить допустимую строку FEN) - PullRequest
0 голосов
/ 09 октября 2019

Попытка построить действительную FEN-строку .

Учитывая этот пример массива 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

1 Ответ

2 голосов
/ 09 октября 2019
$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);

код выше генерирует требуемый вывод и сохраняет его в $ результате.

...