Я так потерян. Может кто-нибудь объяснить, как я могу сократить этот код. У меня есть сотни таких! Я отправляю форму с входным значением. Всякий раз, когда я не заполняю значение, я получаю ошибку. Таким образом, я сделал эти блоки isset, чтобы предотвратить возврат ошибки. Но я выгляжу так неэффективно! Пожалуйста, помогите … спасибо
if(isset($_POST['input74'])){
$value74 = $_POST['input74'];
}else{
$value74 = "";#default value
}
if(isset($_POST['input75'])){
$value75 = $_POST['input75'];
}else{
$value75 = "";#default value
}
if(isset($_POST['input76'])){
$value76 = $_POST['input76'];
}else{
$value76 = "";#default value
В PHP есть поддержка массивов в формах. Вы можете назвать поля формы с индексами, например, <input type="text" name="input[74]" ... />
, Затем в PHP вы можете получить доступ к тем с for
или же foreach
цикл, потому что они будут доступны в виде массива (т.е. у вас будет $_POST["input"][74]
). Таким образом, вы можете написать что-то вроде:
$values = $_POST["input"];
for ($i = 0; $i < MAX_INPUTS; $i++) {
if (!isset($values[$i])) {
$values[$i] = ""; // default value
}
}
Если по какой-то причине вы не можете изменить сторону HTML, вы все равно можете использовать цикл для динамического создания имен полей и копирования данных в массив на стороне PHP, что-то вроде:
$value = array();
for ($i = 0; $i < MAX_INPUTS; $i++) {
$name = sprintf("input%d", $i);
if (isset($_POST[$name])) {
$value[$i] = $_POST[$name];
} else {
$value[$i] = ""; // default
}
}
В обоих предложенных решениях у вас есть только несколько строк кода вместо десятков повторений почти одинаковых строк. В обоих примерах я предполагаю, что ваши поля начинаются с input0
и что в общей сложности MAX_INPUTS
поля. Если не все поля существуют (например, у вас есть только input1, intput2, input74 и input75), вы можете создать массив с номерами полей:
$field_list = array(1,2,74,75);
И затем используйте это для проверки ваших данных (здесь пример с массивами в именах полей HTML):
$values = $_POST["input"];
foreach ($field_list as $num) {
if (!isset($values[$num])) {
$values[$num] = ""; // default value
}
}
В PHP 7 появился новый оператор для решения этой конкретной ситуации: нулевой оператор объединения (??) заменяет это:
$foo = isset($foo) ? $foo : $bar
С этим:
$foo = $foo ?? $bar;
Вы могли бы обернуть isset
в такой функции
function myIsset(&$variable, $default = "")
{
if(isset($variable))
{
return $variable;
}
else
{
return $default;
}
}
тогда ты просто называешь это как $value74 = myIsset($_POST['input74']);
второй аргумент по умолчанию равен пустой строке, поэтому, если вы хотите установить значение по умолчанию, вы можете указать его или изменить значение по умолчанию в заголовке функции, если они все будут одинаковыми. ниже приведен снимок экрана, показывающий работающий код
в то время как да, вы все равно будете иметь одну строку в $_POST
по крайней мере, вы exchnge 5 строк кода с 1 строкой кода и функции выше. Вы можете свести это к циклу, как я объясняю в этот ответ однако, не видя форму и не подтверждая какой-либо шаблон, я не могу привести примеры кода для этого, так как то, что вы показали, может быть просто совпадением
Используйте троичные, чтобы сократить код:
$value74 = isset($_POST['input74']) ? $_POST['input74'] : 'Default value';
$value75 = isset($_POST['input75']) ? $_POST['input75'] : 'Default value';
$value76 = isset($_POST['input76']) ? $_POST['input76'] : 'Default value';
Или вы также можете перебрать массив $ _POST, но необходимо выполнить некоторую фильтрацию / проверку. Быстрая идея:
if(!empty($_POST)) {
$i = 0;
$arr = array();
foreach($_POST as $input) {
$arr[$i] = $input;
$i++;
}
}
$arr
будет производить массив как
Array
(
[74] => 'value74'
[75] => 'value75'
[76] => 'value76'
)
Если я правильно понимаю, что вы хотите установить переменную для публикации или иным образом значения по умолчанию, вы можете сделать это, следуя приведенной ниже структуре:
$variable = isset($_POST['name']) ? $_POST['name] : "defaultvalue";
Это установит переменную, которая существует, в противном случае установите указанное значение по умолчанию. Надеюсь, это поможет.
Вы могли бы использовать array_merge
,
Вы должны настроить свой массив по умолчанию со всеми предоставленными значениями ввода по умолчанию.
$aryDefault = ['input74'=>'', 'input75'=>'',...]
затем array_merge
это с вашим массивом записей, и он заполнит все пропущенные значения. ПРИМЕЧАНИЕ: порядок важен проверить документы.
Если входные массивы имеют одинаковые строковые ключи, то более позднее значение
для этого ключа будет перезаписать предыдущий. Если, однако, массивы
содержат числовые ключи, более позднее значение не будет перезаписывать оригинал
значение, но будет добавлено.
использование array_merge($aryDefault, $_POST)
чтобы $_POST
перезаписывает значения по умолчанию.
Кроме того, вы можете использовать переменные переменные, чтобы вы могли сделать это в цикле. Если все ваши переменные названы в честь ключей массива, как в вашем примере.
Полный код:
$aryDefault = ['input74'=>'', 'input75'=>'',...];
$aryFinal = array_merge($aryDefaults, $_POST);
foreach( $aryFinal as $key=>$value){
$$key = $value;
}
Вы даже можете сгенерировать $ aryDefault с помощью цикла, если он очень большой.
$aryDefault = array();
for(i=0;i<=100;i++){
$aryDefault["input$i"] = "";
}
Вы можете создать простую функцию для инкапсуляции кода:
function post($key, $default = null){
return isset ($_POST[$key])?$_POST[$key]:$default;
}