Хранение синтаксиса PHP в переменных - PullRequest
2 голосов
/ 06 марта 2011

Возможно ли сохранить синтаксис PHP в переменных для последующего использования и повторения следующим образом:

$ifStart = "if(";
$ifEnd = "){ echo 'Test'; }";

$ifStart 'A' == 'B' $ifEnd;

Редактировать: Я пытаюсь сделать следующее:

У меня есть 3 поля формы, и когда PHP-скрипт загружен, можно установить любое из трех. Ни один не может быть установлен, два, один ... Так что мне нужен какой-то способ, чтобы определить, сколько установлено и что выводить в соответствии с этим. Вот почему.

Редактировать: Верно, поэтому у меня есть один HTML Select и два поля ввода текста. Мой скрипт проверяет, установлены ли эти поля (isset) и выполняет ли он соответствующий код, помещая информацию в массивы и т. Д. Теперь я хочу проверить, установлены ли переменные одна за другой, чтобы я мог вывести правильные значения. результаты, которые я сохранил в массивах.

Новое редактирование: Это, очевидно, так сложно объяснить. Но представьте себе поисковую систему, в которой вы решаете, какие поля вы хотите заполнить, а затем скрипт проверяет, какие поля установлены, и просматривает массив со всеми результатами, собирая только элементы с подэлементами, соответствующими запрошенному поиску. Вот чего я пытаюсь достичь.

Вот конструкция массива с выбранными / установленными ВОЗРАСТОМ и КОЛИЧЕСТВОМ в POST (следовательно, почему нет элементов [city]:

Array

( [1] => Массив ( [id] => 1 [age] => 19 [county] => 4353 ) * * Тысяча двадцать-один

[2] => Array
    (
        [id] => 2
        [age] => 20
        [county] => 4020
    )

[3] => Array
    (
        [id] => 3
        [age] => 30
        [county] => 4020
    )

)


Все еще пытаюсь понять, как выбрать только конкретный элемент массива в зависимости от его содержимого. Например, у меня есть такой массив:

Массив (1: [возраст] [округ], 2: [возраст] [округ], 3: [возраст], 4: [округ], 5: [возраст] [округ])

Затем я бы хотел выбрать только идентификаторы, содержащие возраст и округ, в этом примере - идентификаторы 1, 2 и 5.

Редактировать: Это будет похоже на SQL-запрос: ГДЕ возраст и округ, только это в массиве

Ответы [ 6 ]

2 голосов
/ 06 марта 2011

Это возможно ...

НО

если вам придется это сделать, то определенно что-то не так с вашим дизайном !

[Правка после правки] Твои правки показывают, что я был прав.То, что вы пытаетесь сделать, может быть выполнено лучшим способом!

Поэтому, если я вас правильно понимаю, вы захотите изменить свой вывод в соответствии с тем, какие поля формы были заполнены / заполнены пользователем.Пока что вы храните некоторые значения из массива $ _POST в другом массиве.Чтобы сгенерировать вывод, было бы лучше зациклить этот массив и объединить строки, в зависимости от того, что было заполнено.

foreach ($myArray as $formField => $value)
{
    //do something for each $formField, depending on the $value
}

Если это все еще оставляет вас озадаченным, прокомментируйте здесь.


То, как вы это написали, не сработает, вам нужно будет использовать eval().Использование eval() в большинстве случаев является плохой практикой.Это не было бы главной проблемой, однако, главная проблема в том, что такой код трудно читать, трудно отлаживать, а также поддерживать и трудно документировать.Все это все, это плохая практика и приведет к плохому решению и большему количеству проблем.

2 голосов
/ 06 марта 2011

Один чистый способ (чистый, потому что он избегает eval ()) для создания относительно динамического кода - это сохранить либо имя функции, либо, после php 5.3, ссылку на функцию.

Например, что-то вроде:

$callback = "truth_check";

$condition_result = ($a == $b);

if(is_callable($callback)){
    $callback($condition_result);
}

См. Работающий пример здесь: http://ideone.com/1SBYS

В вашем случае обратный вызов может быть результатом выполнения, например, «print_message_on_true_input» в качестве некоторой функции сравнения, а ввод может быть результатомусловное тестирование в любом месте вашего кода, например, $ print = (false || $ a == $ b);

Укажите ваши конкретные случаи использования, поскольку 90% времени предполагаемого поведения может быть достигнуто значительноменее хрупко без обращения к динамическому коду вообще.

0 голосов
/ 07 марта 2011

Хорошо, поэтому то, что вам нужно, не имеет никакого отношения к динамическому коду, связанному с вашим первоначальным вопросом, поэтому я собираюсь начать сначала и полностью предложить другой подход:

//INITIALIZE
//get your input variables, defaulting to null
$inputs = array('select'=>@$_REQUEST['select_name'], 'input1'=>@$_REQUEST['input_1_name'], 'input2'=>@$_REQUEST['input_2_name']);
// initialize your output variables
$out1 = $out2 = $out3 = null;

//MANIPULATIONS
//perform actions based on the presence of variables in the array
if($inputs['select'] == 'whatever'){
    $out1 = 'select was '.htmlentities($inputs['select']);
}
// .... perform more manipulations, setting output strings ...

// OUTPUT SECTION
echo $out1.$out2.$out3;
0 голосов
/ 06 марта 2011

Имейте в виду комментарии выше, которые предупреждают вас об этой идее!

Но вы, вероятно, могли бы сделать это:

$ifStart = "if(";
$ifEnd = "){ echo 'Test'; }";

eval( "  {$ifStart} 'A' == 'B' {$ifEnd} " );
0 голосов
/ 06 марта 2011

Нет.Вместо этого вы можете использовать функции.

function my_compare($a, $b, $symbol = '==') {
  eval('$result = $a ' . $symbol . ' $b;');
  if ($result) echo 'Test';
}
// ...

my_compare('A', 'B');
0 голосов
/ 06 марта 2011

Возможно ли это? Да, используя eval.

Стоит ли это делать? НЕТ НЕТ НЕТ НЕТ НЕТ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...