上班闲时了解九宫格,就自己写了个2n-1宫格的类:
class Build_Grids
{/**
* @var int 行颜色;
*/
private $_tdStyle = 'style="border:1px solid;text-align:center;padding:5px 30px 5px 30px;font-size:16px;font-family:arial;background:#FDE9D9;"';
/**
* @var int 行颜色;
*/
private $_tdVlaueStyle = 'style="border:1px solid;text-align:center;padding:5px 30px 5px 30px;font-size:16px;font-family:arial;"';
/**
* @author:linquan 2017-11-28;
* @param $n int 宫格数;
* @return multitype:array
* @desc 显示宫格;
*/
public function displayGrid($n)
{
$result = $this->getDisplayGrid($n);
echo $result;
}
/**
* @author:linquan 2017-11-28;
* @param $n int 宫格数;
* @return multitype:array
* @desc 获取展示用的宫格html代码;
*/
public function getDisplayGrid($n)
{
$result = $this->_setHeader();
$result .= $this->_setGrid($n);
$result .= $this->_setTailer();
return $result;}
/**
* @author:linquan 2017-11-28;
* @param $n int 宫格数;
* @return multitype:array
* @desc 获取宫格;
*/
public function getGrid($n)
{
if(!is_int($n) || $n<3 || $n%2 == 0){
exit('只能创建奇数宫格且不小于3的整数');
}
$x = ($n+1)/2;
$y = $n;
$count = $n*$n+1;
$grids = array();
$grids[$x][$y] = 1;
for($i=2; $i<$count; $i++){
//找到正常情况下的下一个坐标;
list($x, $y) = $this->_getNextKey($n, $x, $y);
//判断位置是否冲突,冲突则查找新位置;
if(isset($grids[$x][$y])){
list($x, $y) = $this->_getNewKey($n, $x, $y);
}
//找到新坐标,赋值;
$grids[$x][$y] = $i;
}
return $grids;
}
/**
* @author:linquan 2017-11-29;
* @param $n int 宫格数;
* @param $x int x坐标;
* @param $y int y坐标;
* @return multitype:array
* @desc 找到正常情况下的下一个位置;
*/
private function _getNextKey($n, $x, $y)
{
$x++;
$y++;
$x = $x > $n? 1: $x;
$y = $y > $n? 1: $y;
return array($x, $y);}
* @author:linquan 2017-11-29;
* @param $n int 宫格数;
* @param $x int x坐标;
* @param $y int y坐标;
* @return multitype:array
* @desc 下一个位置存在数据时,获取原位置下方的位置;
*/
private function _getNewKey($n, $x, $y)
{
$x--;
$y -= 2;
//验证正常移动;
$x = $x < 1? $x+$n: $x;
$y = $y < 1? $y+$n: $y;
return array($x, $y);
}
/**
* @author:linquan 2017-11-28;
* @param $n int 宫格数;
* @return multitype:array
* @desc 设置宫格值;
*/
private function _setGrid($n)
{
$result = '';
$grids = $this->getGrid($n);
$tdAttr = $this->_tdStyle;
//整理宫格数的html;
for ($j=$n; $j>0; $j--) {
$result .= '<tr>';
for ($i=1; $i<=$n; $i++) {
$result .= '<td '. $tdAttr .'>'. $grids[$i][$j] .'</td>';
}
$result .= '</tr>';
}
return $result;
}
/**
* 头部信息;
* @author:linquan 2017-11-21;
* @return 表格头的HTML代码;
*/
private function _setHeader()
{
return '<table style="border-collapse:collapse;margin:10px;border:1px solid;" cellpadding="5" cellspacing="0">';
}
/**
* 尾部信息;
* @author:linquan 2017-11-21;
* @return 表格尾部的HTML代码;
*/
private function _setTailer()
{
return '</table>';
}
}
$grids = new Build_Grids();
// p($grids->getGrid(5));
$grids->displayGrid(9);
复制代码直接执行即可展示。