Добрый день. Имеется массив из микрорайонов города. Микрорайоны входя в районы города. Создать многоуровневый массив не получилось из-за сложности обработки. Я сделал несколько (8) массивов по названиям районов и 8 раз одинаковый код обращения к 8 разным массивам и последующей обработке их в цикле. Вопрос: Можно ли генерить php код в php коде (через цикл) или процедуру, чтобы 8 раз одно и тоже не писать, т.к. по факту меняется только имя массива к которому я обращаюсь за выводом информации. Цель уменьшить количество однотипного кода. Массивы используются ассоциативные. Спасибо. Спойлер: пример массива микрорайонов (1 из 8) PHP: $chkalovskiy = array('Ботанический' => 'botanicheskij', 'Вторчермет' => 'Vtorchermet', 'Елизавет' => 'elizavet', 'Нижне-Исетский (Нижне-Исетск)' => 'Nizhne-Isetskij (Nizhne-Isetsk)', 'Рудный' => 'Rudnyj', 'Уктусский (Уктус)' => 'Uktusskij (Uktus)', 'Химмаш' => 'KHimmash', 'Южный (Автовокзал), часть' => 'avtovokzal', 'Приисковый' => 'Priiskovyj', 'Хутор' => 'KHutor'); Спойлер: пример повторяющегося 8 раз кодакода блок записи конф файла PHP: foreach ($chkalovskiy as $raion => $value) { if (!empty($_POST[$raion])) { empty($_POST[$raion]) ? fputs($conffile, $raion."_enable=no" . "\n"): fputs($conffile, $raion."_enable=yes" . "\n"); $message=$message ."./raions/".$value.".wav "; $countr=$countr+1; } } Блок генерации html (1 из 8) <div> <fieldset class="fieldsetbig"><legend>Чкаловский район</legend> PHP: <?php foreach ($chkalovskiy as $raion => $value) { echo'<input type="checkbox" id="idr'.$raion.'" value="'.$raion.'" name="'.$raion.'"'; if ($ini[$raion.'_enable']=="yes") echo 'checked="checked"'; echo'><label for="idr'.$raion.'" >'.$raion.'</label>'; } ?> </fieldset> </div>
Есть такая штука, функции называется, специально для повторного использования кода придумали И не надо извращениями заниматься.
знаю, по ошибке назвал функцию процедурой в теле вопроса. Вот навоял функцию, не работает. До цикла foreach параметр отрабатывает, а вот внутри цикла никакой реакции. Ну, если честно, без функции такое же поведение. Спойлер: код PHP: $keys = array_keys($raionarrarray); genfieldraion($raionarrarray[array_keys($raionarrarray)[0]], $keys[0]); function genfieldraion($raion, $key) { echo '<div><fieldset class="fieldsetbig"><legend>'.$raion.'</legend>'; foreach ($key as $raion => $value) { echo'<input type="checkbox" id="idr'.$raion.'" value="'.$raion.'" name="'.$raion.'"'; if ($ini[$raion.'_enable']=="yes") echo 'checked="checked"'; echo'><label for="idr'.$raion.'" >'.$raion.'</label>'; } echo '</div>'; }
Вот здесь лучше поменять foreach ($key as $raion => $value) на foreach ($raion as $key => $value) попробуй внутри функции сделать print_r($raion); Что она выведет? Должна появляться структура того массива, который передан функции в качестве параметра. Зачем второй параметр $key я не понял. Перебор у тебя без него можно организовать. В операторах echo используй значения $value
Спойлер: код PHP: function genfieldraion($raion, $key) { echo '<div><fieldset class="fieldsetbig"><legend>'.$raion.'</legend>'; foreach ($raion as $key => $value) { echo'<input type="checkbox" id="idr'.$raion.'" value="'.$raion.'" name="'.$raion.'"'; if ($ini[$raion.'_enable']=="yes") echo 'checked="checked"'; echo'><label for="idr'.$raion.'" >'.$key.'</label>'; } echo '</div>'; echo $key.' кей ' ; //.' '.$key; print_r($raion. ' район'); } результат: $akadem кей Академический район район тоесть из переменной $key выводится $akadem а из $raion Академический район Я так понимаю у меня foreach не отрабатывает --- Добавлено --- там выше парсинг ини файла, можно не обращать внимания
А где ты вызываешь эту функцию function genfieldraion($raion, $key) и не проще сделать скриншот экрана результата ее действия?
вызов ниже (выше, я так понимаю без разницы), но у меня ниже $keys = array_keys($raionarrarray); genfieldraion($raionarrarray[array_keys($raionarrarray)[0]], $keys[0]); Спойлер: картинки Код https://ibb.co/p0cWp1x Веб https://ibb.co/mJYmLTK Если делать так: https://ibb.co/vBw00B6 , то все ок: https://ibb.co/ryTmYvk
genfieldraion($raionarrarray[array_keys($raionarrarray)[0]], $keys[0]); В этой строчке ты передаешь массив. Он что у тебя многомерный? Или ты передаешь строку?
В первом сообщении пример массива. Ассоциативный он, типа словаря. Русское написание это значение, английское написание это ключ. Так вот вопрос собственно могу ли я ключ запихнуть в интрепритируемое выражение цикла foreach ну или блин как-то иначе сделать.
Вот у меня такая функция получилась PHP: <!DOCTYPE html> <html> <head> <title>Пример работы с массивом</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <?php $array_name = 'Чкаловский'; $chkalovskiy = array('Ботанический' => 'botanicheskij', 'Вторчермет' => 'Vtorchermet', 'Елизавет' => 'elizavet', 'Нижне-Исетский (Нижне-Исетск)' => 'Nizhne-Isetskij (Nizhne-Isetsk)', 'Рудный' => 'Rudnyj', 'Уктусский (Уктус)' => 'Uktusskij (Uktus)', 'Химмаш' => 'KHimmash', 'Южный (Автовокзал), часть' => 'avtovokzal', 'Приисковый' => 'Priiskovyj', 'Хутор' => 'KHutor'); print_r ($chkalovskiy); function genfieldraion($raion,$array_name) { echo '<div><fieldset class="fieldsetbig"><legend>'.$array_name.'</legend>'; foreach ($raion as $key => $value) { echo'<input type="checkbox" id="idr'.$raion.'" value="'.$raion.'" name="'.$raion.'"'; if ($ini[$raion.'_enable']=="yes") echo 'checked="checked"'; echo'><label for="idr'.$raion.'" >'.$key.'</label>'; } echo '</div>'; } genfieldraion($chkalovskiy,$array_name); ?> </body> </html>
Вот доработал массив(теперь он содержит свое название. И функцию тоже: PHP: <?php $chkalovskiy = array(0 => 'Чкаловский',1 => array('Ботанический' => 'botanicheskij', 'Вторчермет' => 'Vtorchermet', 'Елизавет' => 'elizavet', 'Нижне-Исетский (Нижне-Исетск)' => 'Nizhne-Isetskij (Nizhne-Isetsk)', 'Рудный' => 'Rudnyj', 'Уктусский (Уктус)' => 'Uktusskij (Uktus)', 'Химмаш' => 'KHimmash', 'Южный (Автовокзал), часть' => 'avtovokzal', 'Приисковый' => 'Priiskovyj', 'Хутор' => 'KHutor')); function genfieldraion($array) { echo '<div><fieldset class="fieldsetbig"><legend>'.$array[0].'</legend>'; foreach ($array[1] as $key => $value) { echo'<input type="checkbox" id="idr'.$raion.'" value="'.$raion.'" name="'.$raion.'"'; if ($ini[$raion.'_enable']=="yes") echo 'checked="checked"'; echo'><label for="idr'.$raion.'" >'.$key.'</label><br>'; } echo '</div>'; } genfieldraion($chkalovskiy); ?> --- Добавлено --- Знаешь, мне показалось, что наоборот. Ведь ключи должны указываться ПЕРЕД значениями. Впрочем, уже неважно.
@antoniii, спасибо. Использовал первый вариант. Не совсем то, что хотел, но как вариант. С одним "но," внутри функции переменные, так вот, чтобы они работали, надо их глобальными объявлять (ну это я так, на всякий случай). Вдруг кто не знает.