За последние 24 часа нас посетили 36769 программистов и 7745 роботов. Сейчас ищут 1714 программистов ...

Генерация php кода в php коде

Тема в разделе "PHP для новичков", создана пользователем sjakabelch, 27 окт 2022.

  1. sjakabelch

    sjakabelch Новичок

    С нами с:
    27 окт 2022
    Сообщения:
    6
    Симпатии:
    0
    Добрый день.
    Имеется массив из микрорайонов города.
    Микрорайоны входя в районы города.
    Создать многоуровневый массив не получилось из-за сложности обработки. Я сделал несколько (8) массивов по названиям районов и 8 раз одинаковый код обращения к 8 разным массивам и последующей обработке их в цикле. Вопрос:
    Можно ли генерить php код в php коде (через цикл) или процедуру, чтобы 8 раз одно и тоже не писать, т.к. по факту меняется только имя массива к которому я обращаюсь за выводом информации. Цель уменьшить количество однотипного кода.
    Массивы используются ассоциативные.
    Спасибо.
    PHP:
    1. $chkalovskiy = array('Ботанический' => 'botanicheskij',
    2. 'Вторчермет' => 'Vtorchermet',
    3. 'Елизавет' => 'elizavet',
    4. 'Нижне-Исетский (Нижне-Исетск)' => 'Nizhne-Isetskij (Nizhne-Isetsk)',
    5. 'Рудный' => 'Rudnyj',
    6. 'Уктусский (Уктус)' => 'Uktusskij (Uktus)',
    7. 'Химмаш' => 'KHimmash',
    8. 'Южный (Автовокзал), часть' => 'avtovokzal',
    9. 'Приисковый' => 'Priiskovyj',
    10. 'Хутор' => 'KHutor');
    блок записи конф файла
    PHP:
    1. foreach ($chkalovskiy as $raion => $value)
    2. {
    3. if (!empty($_POST[$raion]))
    4.   {
    5.    empty($_POST[$raion]) ? fputs($conffile, $raion."_enable=no" . "\n"): fputs($conffile, $raion."_enable=yes" . "\n");
    6.    $message=$message ."./raions/".$value.".wav ";
    7.    $countr=$countr+1;
    8.   }
    9. }
    Блок генерации html (1 из 8)
    <div>
    <fieldset class="fieldsetbig"><legend>Чкаловский район</legend>
    PHP:
    1. <?php
    2. foreach ($chkalovskiy  as $raion => $value)
    3. {
    4. echo'<input type="checkbox" id="idr'.$raion.'" value="'.$raion.'" name="'.$raion.'"';
    5.      if ($ini[$raion.'_enable']=="yes") echo 'checked="checked"';
    6.     echo'><label for="idr'.$raion.'" >'.$raion.'</label>';
    7. }
    8.  
    9. ?>
    </fieldset>
    </div>
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Есть такая штука, функции называется, специально для повторного использования кода придумали :) И не надо извращениями заниматься.
     
  3. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.874
    Симпатии:
    753
    Адрес:
    Татарстан
    как минимум - странно ... может всю задачу озвучите, чтоб 8 массивов не создавать?
     
    #3 ADSoft, 27 окт 2022
    Последнее редактирование: 27 окт 2022
  4. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Явно человек пытается надуть, что он не знает про функции.
     
  5. sjakabelch

    sjakabelch Новичок

    С нами с:
    27 окт 2022
    Сообщения:
    6
    Симпатии:
    0
    знаю, по ошибке назвал функцию процедурой в теле вопроса.
    Вот навоял функцию, не работает. До цикла foreach параметр отрабатывает, а вот внутри цикла никакой реакции. Ну, если честно, без функции такое же поведение.
    PHP:
    1. $keys = array_keys($raionarrarray);
    2.  
    3. genfieldraion($raionarrarray[array_keys($raionarrarray)[0]], $keys[0]);
    4.  
    5. function genfieldraion($raion, $key)
    6. {
    7. echo '<div><fieldset class="fieldsetbig"><legend>'.$raion.'</legend>';
    8.  
    9. foreach ($key  as $raion => $value)
    10. {
    11. echo'<input type="checkbox" id="idr'.$raion.'" value="'.$raion.'" name="'.$raion.'"';
    12.      if ($ini[$raion.'_enable']=="yes") echo 'checked="checked"';
    13.     echo'><label for="idr'.$raion.'" >'.$raion.'</label>';
    14. }
    15. echo '</div>';
    16. }
     
  6. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Вот здесь лучше поменять
    foreach ($key as $raion => $value) на foreach ($raion as $key => $value)
    попробуй внутри функции сделать print_r($raion);
    Что она выведет?
    Должна появляться структура того массива, который передан функции в качестве параметра. Зачем второй параметр $key я не понял. Перебор у тебя без него можно организовать.
    В операторах echo используй значения $value
     
  7. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Что за переменная $ini не подскажешь?
     
  8. sjakabelch

    sjakabelch Новичок

    С нами с:
    27 окт 2022
    Сообщения:
    6
    Симпатии:
    0
    PHP:
    1. function genfieldraion($raion, $key)
    2. {
    3. echo '<div><fieldset class="fieldsetbig"><legend>'.$raion.'</legend>';
    4. foreach ($raion as $key => $value)
    5. {
    6. echo'<input type="checkbox" id="idr'.$raion.'" value="'.$raion.'" name="'.$raion.'"';
    7.      if ($ini[$raion.'_enable']=="yes") echo 'checked="checked"';
    8.     echo'><label for="idr'.$raion.'" >'.$key.'</label>';
    9. }
    10. echo '</div>';
    11. echo $key.' кей ' ;
    12. //.' '.$key;
    13. print_r($raion. ' район');
    14. }
    результат:
    $akadem кей Академический район район
    тоесть из переменной $key выводится $akadem а из $raion Академический район
    Я так понимаю у меня foreach не отрабатывает
    --- Добавлено ---
    там выше парсинг ини файла, можно не обращать внимания
     
    #8 sjakabelch, 28 окт 2022
    Последнее редактирование: 28 окт 2022
  9. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    А где ты вызываешь эту функцию function genfieldraion($raion, $key) и не проще сделать скриншот экрана результата ее действия?
     
  10. sjakabelch

    sjakabelch Новичок

    С нами с:
    27 окт 2022
    Сообщения:
    6
    Симпатии:
    0
    вызов ниже (выше, я так понимаю без разницы), но у меня ниже

    $keys = array_keys($raionarrarray);

    genfieldraion($raionarrarray[array_keys($raionarrarray)[0]], $keys[0]);
    [​IMG]Код https://ibb.co/p0cWp1x[​IMG] Веб https://ibb.co/mJYmLTK
    Если делать так: https://ibb.co/vBw00B6 , то все ок: https://ibb.co/ryTmYvk
     
  11. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    genfieldraion($raionarrarray[array_keys($raionarrarray)[0]], $keys[0]);
    В этой строчке ты передаешь массив. Он что у тебя многомерный? Или ты передаешь строку?
     
  12. sjakabelch

    sjakabelch Новичок

    С нами с:
    27 окт 2022
    Сообщения:
    6
    Симпатии:
    0
    В первом сообщении пример массива. Ассоциативный он, типа словаря. Русское написание это значение, английское написание это ключ. Так вот вопрос собственно могу ли я ключ запихнуть в интрепритируемое выражение цикла foreach ну или блин как-то иначе сделать.
     
  13. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Вот у меня такая функция получилась
    PHP:
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <title>Пример работы с массивом</title>
    5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    6. </head>
    7. <body>
    8. <?php
    9. $array_name = 'Чкаловский';
    10. $chkalovskiy = array('Ботанический' => 'botanicheskij',
    11. 'Вторчермет' => 'Vtorchermet',
    12. 'Елизавет' => 'elizavet',
    13. 'Нижне-Исетский (Нижне-Исетск)' => 'Nizhne-Isetskij (Nizhne-Isetsk)',
    14. 'Рудный' => 'Rudnyj',
    15. 'Уктусский (Уктус)' => 'Uktusskij (Uktus)',
    16. 'Химмаш' => 'KHimmash',
    17. 'Южный (Автовокзал), часть' => 'avtovokzal',
    18. 'Приисковый' => 'Priiskovyj',
    19. 'Хутор' => 'KHutor');
    20. print_r ($chkalovskiy);
    21. function genfieldraion($raion,$array_name)
    22. {
    23. echo '<div><fieldset class="fieldsetbig"><legend>'.$array_name.'</legend>';
    24. foreach ($raion as $key => $value)
    25. {
    26. echo'<input type="checkbox" id="idr'.$raion.'" value="'.$raion.'" name="'.$raion.'"';
    27.      if ($ini[$raion.'_enable']=="yes") echo 'checked="checked"';
    28.     echo'><label for="idr'.$raion.'" >'.$key.'</label>';
    29. }
    30. echo '</div>';
    31.  
    32.  
    33. }
    34. genfieldraion($chkalovskiy,$array_name);
    35. ?>
    36. </body>
    37. </html>
     
  14. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Вот доработал массив(теперь он содержит свое название. И функцию тоже:
    PHP:
    1. <?php
    2. $chkalovskiy = array(0 => 'Чкаловский',1 => array('Ботанический' => 'botanicheskij',
    3. 'Вторчермет' => 'Vtorchermet',
    4. 'Елизавет' => 'elizavet',
    5. 'Нижне-Исетский (Нижне-Исетск)' => 'Nizhne-Isetskij (Nizhne-Isetsk)',
    6. 'Рудный' => 'Rudnyj',
    7. 'Уктусский (Уктус)' => 'Uktusskij (Uktus)',
    8. 'Химмаш' => 'KHimmash',
    9. 'Южный (Автовокзал), часть' => 'avtovokzal',
    10. 'Приисковый' => 'Priiskovyj',
    11. 'Хутор' => 'KHutor'));
    12.  
    13. function genfieldraion($array)
    14. {
    15. echo '<div><fieldset class="fieldsetbig"><legend>'.$array[0].'</legend>';
    16. foreach ($array[1] as $key => $value)
    17. {
    18. echo'<input type="checkbox" id="idr'.$raion.'" value="'.$raion.'" name="'.$raion.'"';
    19.      if ($ini[$raion.'_enable']=="yes") echo 'checked="checked"';
    20.     echo'><label for="idr'.$raion.'" >'.$key.'</label><br>';
    21. }
    22. echo '</div>';
    23.  
    24. }
    25. genfieldraion($chkalovskiy);
    26. ?>
    --- Добавлено ---
    Знаешь, мне показалось, что наоборот. Ведь ключи должны указываться ПЕРЕД значениями. Впрочем, уже неважно.
     
  15. sjakabelch

    sjakabelch Новичок

    С нами с:
    27 окт 2022
    Сообщения:
    6
    Симпатии:
    0
    @antoniii, спасибо. Использовал первый вариант. Не совсем то, что хотел, но как вариант. С одним "но," внутри функции переменные, так вот, чтобы они работали, надо их глобальными объявлять (ну это я так, на всякий случай). Вдруг кто не знает.
     
  16. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Можно еще передать в функцию переменную как параметр. Положить в скобочки и пользоваться.