Предположим, на входе координаты центральной клетки и размеры поля, и координаты отсчитываются от 0,0.
Для верхней и нижней строки проверяем не выходит ли она за границы. Внутри строки проверяем, нет ли выхода за границы по горизонтали.
Как-то так:
/**
* @param int $x center
* @param int $y center
* @param int $width
* @param int $height
*/
function getNeighbours($x, $y, $width, $height) {
$result = [];
// 1st row
if ($y > 0) {
$rowY = $y - 1;
$result[0] = $x > 0 ? [$x - 1, $rowY] : null;
$result[1] = [$x, $rowY];
$result[2] = $x < $width - 1 ? [$x + 1, $rowY] : null;
} else {
$result[0] = $result[1] = $result[2] = null;
}
// 2nd row
$rowY = $y;
$result[3] = $x > 0 ? [$x - 1, $rowY] : null;
$result[4] = [$x, $rowY];
$result[5] = $x < $width - 1 ? [$x + 1, $rowY] : null;
// 3rd row
if ($y < $height) {
$rowY = $y + 1;
$result[6] = $x > 0 ? [$x - 1, $rowY] : null;
$result[7] = [$x, $rowY];
$result[8] = $x < $width - 1 ? [$x + 1, $rowY] : null;
} else {
$result[6] = $result[7] = $result[8] = null;
}
return $result;
}
Пример1getNeighbours(5, 7, 10, 10);
Array
(
[0] => Array
(
[0] => 4
[1] => 6
)
[1] => Array
(
[0] => 5
[1] => 6
)
[2] => Array
(
[0] => 6
[1] => 6
)
[3] => Array
(
[0] => 4
[1] => 7
)
[4] => Array
(
[0] => 5
[1] => 7
)
[5] => Array
(
[0] => 6
[1] => 7
)
[6] => Array
(
[0] => 4
[1] => 8
)
[7] => Array
(
[0] => 5
[1] => 8
)
[8] => Array
(
[0] => 6
[1] => 8
)
)
Пример2getNeighbours(5, 3, 5, 5);
Array
(
[0] => Array
(
[0] => 4
[1] => 2
)
[1] => Array
(
[0] => 5
[1] => 2
)
[2] =>
[3] => Array
(
[0] => 4
[1] => 3
)
[4] => Array
(
[0] => 5
[1] => 3
)
[5] =>
[6] => Array
(
[0] => 4
[1] => 4
)
[7] => Array
(
[0] => 5
[1] => 4
)
[8] =>
)