$num; $arr($num); $arr($arr); для ;$i< $num;$i++){
echo $arr[$i] .PHP_EOL; echo '
';
} функция foo($num){
//Fill map
$data = new stdClass();
$data->x = 1;
$data->y = 1;
$data->num = $num;
$data->len = $num * $num;
$data->tmp_data = [];
$data - > rate = 1; // direction
$data->struct = create_struct($num);
for ($i = $data->len;$i>=1;$i--){
$data->i = $i;
$key = change_key($data);
$data->tmp_data[$key] = $i;
unset($data->struct[$key]);
}
//Group by Y coordinate
$data->struct = create_struct($num);
foreach ($data->tmp_data as $key=> $value){
$data->struct[$key]= $value;
}
for ($i=1;$i<=$data->num;$i++){
$start = ($i - 1)*$data->num;
$end = $data->num;
$slice = array_slice($data->struct,$start,$end);
$data->slice[] = '['.implode(",", $slice).']';
}
return $data->slice;} ключ изменения функции($данные){
//check key
$key = $data->x.','.$data->y;
if(isset($data->struct[$key])){
return $key;
}
switch ($data->rate)
{
case 1:
//left
$data->tmp_x = $data->x + 1;
$key = $data->tmp_x.','.$data->y;
if(isset($data->struct[$key])){
$data->x = $data->tmp_x;
return $key;
}else{
$data->rate=2;
$data->y = $data->y+1;
}
break;
case 2:
//down
$data->tmp_y = $data->y + 1;
$key = $data->x.','.$data->tmp_y;
if(isset($data->struct[$key])){
$data->y = $data->tmp_y;
return $key;
}else{
$data->rate=3;
}
break;
case 3:
//right
$data->tmp_x = $data->x - 1;
$key = $data->tmp_x.','.$data->y;
if(isset($data->struct[$key])){
$data->x = $data->tmp_x;
return $key;
}else{
$data->rate=4;
}
break;
case 4:
//up
$data->tmp_y = $data->y - 1;
$key = $data->x.','.$data->tmp_y;
if(isset($data->struct[$key])){
$data->y = $data->tmp_y;
return $key;
}else{
$data->rate=1;
}
break;
}
return change_key($data);} функция create_struct($num){
$struct = [];
for ($i=1;$i<=$num;$i++){
//Nesting
for($m=1;$m<=$num;$m++){
$key = $m . ','. $i;
$struct[$key] = '';
}
}
return $struct;} дамп функции($данные){
echo ''; print_r($data); echo ''; echo '
';
}
Выходные результаты
[73,74,75,76,77,78,79,80,81,82] [72,43,44,45,46,47,48,49,50,83] [71,42,21,22,23,24,25,26,51,84] [70,41,20,7,8,9,10,27,52,85] [69,40,19,6,1,2,11,28,53,86] [68,39,18,5,4,3,12,29,54,87] [67,38,17,16,15,14,13,30,55,88] [66,37,36,35,34,33,32,31,56,89] [65,64,63,62,61,60,59,58,57,90] [100,99,98,97,96,95,94,93,92,91]