БлогNot. PHP: могут ли циклы менять себя сами?

PHP: могут ли циклы менять себя сами?

могут, если они с $усами$!

Ответ на сей досужий вопрос - как в PHP программно поменять местами циклы, уже давался в этой заметке. Разумеется, можно делать подобное и с большим количеством "наворотов", не только передавая в скрипт параметр, заставляющий его менять аргументы циклов "на лету", но и организуя вложенные циклы, модифицируя представление выводимой последовательности и т.п.

Например, показанный ниже скрипт печатает таблицу вида

1,1	1,2	1,3	1,4
2,1	2,2	2,3	2,4
3,1	3,2	3,3	3,4
4,1	4,2	4,3	4,4
5,1	5,2	5,3	5,4

если запустить его без аргумента или с аргументом p=ij (при размещении скрипта в корневой папке локального хоста в файле с именем cycles1.php это будет URL-адрес http://localhost/cycles1.php?p=ij ). При запуске же скрипта с URL-адресом http://localhost/cycles1.php?p=ji вид таблицы изменится на

1,1	2,1	3,1	4,1
1,2	2,2	3,2	4,2
1,3	2,3	3,3	4,3
1,4	2,4	3,4	4,4
1,5	2,5	3,5	4,5

Вот код, проверен в XAMPP с PHP 7.X:

<?php
 $p = array ('i','j');
 if (isset($_GET['p'])) {
  if ($_GET['p']=='ji') $p = array ('j','i');
 }
 $n = 5; $m = 4; //Размерность таблицы
 $rows = $p[0];
 $cols = $p[1]; //Порядок циклов
 echo '<table  style="border-collapse: collapse;">';
 for ($$rows=1; $$rows<=$n; $$rows++) {
  echo '<tr>'; 
  for ($$cols=1; $$cols<=$m; $$cols++) {
   echo '<td style="border: 1px dotted black">'.$i.','.$j.'</td>';
 }
  echo '</tr>';
 }
 echo '</table>';
?>

Чтобы напечатать одномерный массив, интерпретированный как двумерная матрица, подойдёт такое решение (запускать можно как предыдущее, с параметром URL-адреса t или без него, числа выведутся как матрица 3x4 или 4x3):

<?php
 $a = array (
  1, 2, 3, 4,
  5, 6, 7, 8,
  9,10,11,12
 );
 $p = array ('i'=>3,'j'=>4);  //Размерность матрицы
 if (isset($_GET['t'])) $p = array_reverse ($p);
 $keys = array_keys($p);
 $r = $keys[0]; $i2 = $p[$r];
 $c = $keys[1]; $j2 = $p[$c]; //Порядок циклов
 echo '<pre>';
 for ($$r = 0, $k = 0; $$r < $i2; $$r++) {
  for ($$c = 0; $$c < $j2; $$c++) echo $a[$k++].' ';
  echo "\n";
 }
 echo '</pre>';
?>

Если же мы хотим, чтобы счётчиками цикла были непосредственно переменные $i и $j, то переменные переменных в заголовке for нам не понадобятся:

<?php
 $a = array (
  1, 2, 3, 4,
  5, 6, 7, 8,
  9,10,11,12
 );
 $p = array ('i'=>3,'j'=>4);  //Размерность матрицы
 if (isset($_GET['t'])) $p = array_reverse ($p);
 $keys = array_keys($p);
 $i = $keys[0]; $i2 = $p[$i];
 $j = $keys[1]; $j2 = $p[$j]; //Порядок циклов
 echo '<pre>';
 for ($i = 0, $k = 0; $i < $i2; $i++) {
  for ($j = 0; $j < $j2; $j++) echo $a[$k++].' ';
  echo "\n";
 }
 echo '</pre>';
?>

теги: учебное программирование php

04.12.2019, 20:48; рейтинг: 76