Универсальный обход по массиву
Предлагаю вашему вниманию PHP-код - универсальный обходчик любого массива с любым представлением. Используем две функции: 1) функция с циклом (метод ArrFor() в классе) и 2) функция (как аргумент) с оформлением результатов обхода по массиву в цикле.
class Gena
{
function ArrFor($m0,$m1,$f)//Цикл по массиву
{
foreach ($m1 AS $k=>$v)
{
$r.=$f($k,$v,++$i,$m0);//Функция - вид отображения
} return $r;
}
}
//Метка и любые др. данные
$m0=[
'met'=>12,
];
//Массив данных для обхода
$m1=[
'd'=>8,
'f'=>10,
'g'=>12,
'h'=>14,
'i'=>16,
'j'=>18,
];//print_r($m1);
$ob=new Gena();
//Вариант-1
echo $ob->ArrFor($m0,$m1,'uni1')."\n";
function uni1($k,$v,$i,$m0=[])
{
return "$i) $k - $v == {$m0['met']}<br>\n";
}
//Вариант-2
echo "<form><select size='3' multiple name='sel[]'>\n".
$ob->ArrFor($m0,$m1,'uni2').
"</select></form><br>\n\n";
function uni2($k,$v,$i,$m0=[])
{
$s=($v==$m0['met'])?' selected':'';
return "\t<option value='$k'$s>$i) $k - $v == {$m0['met']}</option>\n";
}
//Вариант-3
echo "<ul>\n".$ob->ArrFor($m0,$m1,'uni3')."</ul>\n\n";
function uni3($k,$v,$i,$m0=[])
{
return "\t<li>$i) $k - $v == {$m0['met']}</li>\n";
}
//Вариант-4
echo "<ul>\n".$ob->ArrFor($m0,$m1,function($k,$v,$i,$m0=[])
{
return "\t<li>$i) $k - $v == {$m0['met']}</li>\n";
})."</ul>\n\n";
//Вариант-5
$f=function($k,$v,$i,$m0=[])
{
return "\t<li>$i) $k - $v == {$m0['met']}</li>\n";
};
echo "<ul>\n".$ob->ArrFor($m0,$m1,$f)."</ul>\n\n";
Предлагаю пять вариантов применения данного метода с различными способами передачи аргумента в качестве функции представления и различными видами представлений результатов обхода массива циклом.
или
class Gena{
function superF($m,$n,$f,$ar=[])//Массив, Метка, Функция, Доп. массив
{
return $f($m,$n,$ar);//Массив получает функция
}
function superForeach($m,$n,$f,$ar=[])//Массив, Метка, Функция, Доп. массив
{
$r='';
foreach($m as $k => $v)
$r.=$f($k,$v,$n,$ar);
return $r;
}
}
$G=new Gena;//Создаем объект
$arr=[1,2,3,4,5,6,12,15,22];//Массив для перебора
$Gm1=$G->superF($arr, 3, function($m,$n){
$r=['',0,1]; $n=count($m)-1;
foreach($m as $k => $v)
{
$z=$n!=$k?', ':'';//Запятая
$r[0].="$k=>$v$z";//Список
$r[1]+=$v; //Сумма
$r[2]*=$v; //Факториал
}
return $r;
});
echo "<b>Список:</b> $Gm1[0]<br>\n";
echo "<b>Сумма:</b> $Gm1[1]<br>\n";
echo "<b>Факториал:</b> $Gm1[2]<br>\n";
$Gm2=$G->superForeach($arr, 3, function($k,$v,$n){
$c=$v!=$n?'':' class="c"';
return "\t<li$c>$k - $n=$v</li>\n";
});
echo "<ul>\n$Gm2</ul>";


