Используйте dynamic_cast
для преобразования указателей/ссылок в иерархии наследования.
Использование static_cast
для обычных преобразований типов.
Использование reinterpret_cast
для иного толкования низкого уровня комбинаций двоичных разрядов. Используйте с экстремальной осторожностью.
Использование const_cast
для того, чтобы выбросить const/volatile
. Избегайте этого, если Вы не застреваете с помощью неправильного константой API.
Функции filter_xyz_array () вернут NULL для элемента, которого нет во входном массиве, например
<?php
$args = array(
'foo' => array(
'filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_REQUIRE_ARRAY,
'options' => array('min_range' => 1, 'max_range' => 4)
),
'bar' => array(
'filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_REQUIRE_SCALAR
)
);
$input = array(
'foo'=>array(1,2,3,4)
);
$filtered = filter_var_array($input, $args);
var_dump($filtered);
печатает
array(2) {
["foo"]=>
array(4) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
}
["bar"]=>
NULL
}
isset () возвращает false для элемента переменной / массива, содержащего NULL. Вы можете использовать это, чтобы игнорировать элементы, которые установлены в NULL функциями фильтрации.
В зависимости от того, что вы фильтруете, и структуры массива, возвращаемого функцией фильтра, вы даже можете использовать array_filter () для «очистки» массива.
В итоге я использовал специальное решение, вдохновленное ответом @VolkerK. Я должен был более четко заявить, чего хочу. Я обновил свой вопрос, добавив эту информацию.
Я все еще ищу более простое решение.
Сначала я создал несколько массивов результатов:
// errors to display
$errors = array();
// fields to ignore in the validation step
$ignore_fields = array();
// return values after validation
$returnvalues = array();
Сначала я отфильтровал требуемые поля:
function required($string){
return trim($string) == "" ? false : $string;
}
$required_errors = array(
"firstname" => "Je moet je voornaam invullen.",
"lastname" => "Je moet je achternaam invullen.",
"email" => "Je moet je e-mailadres invullen."
);
$required_filter = array();
foreach($required_errors as $requiredfieldname => $error){
$required_filter[$requiredfieldname] = array(
'filter' => FILTER_CALLBACK,
'options' => "required",
'flags' => FILTER_NULL_ON_FAILURE
);
}
$required_filtered = filter_input_array(INPUT_GET | INPUT_POST,
$required_filter);
foreach($required_errors as $required => $error){
if(!isset($required_filtered[$required])){
$errors[$required] = $required_errors[$required];
$returnvalues[$required] = "";
$ignore_fields[$required] = "ignored"; // value doesn't matter
}
}
Затем проверьте наличие пустые поля и загрузите их со стандартным значением
// ignore the other fields if they are empty;
// the actual form has about 10 values here
$maybeempty = array("from", "to", "phonenumber");
$optional_defaultvalue = array(
"from" => 0,
"to" => 0,
"phonenumber" => "",
);
$optional_filter = array();
foreach($maybeempty as $field){
$required_filter[$requiredfieldname] = array(
'filter' => FILTER_CALLBACK,
'options' => "required",
'flags' => FILTER_NULL_ON_FAILURE
);
}
$optional_filtered = filter_input_array(INPUT_GET | INPUT_POST,
$required_filter);
foreach($maybeempty as $field){
if(!isset($optional_filtered[$field])){
$ignore_fields[$field] = "ignored"; // value doesn't matter
$returnvalue[$field] = $optional_defaultvalue[$field];
}
}
На последнем этапе я построю массив проверки, пользовательские сообщения об ошибках и проигнорирую поля игнорирования, чтобы пропустить пустые поля или поля, в которых уже была ошибка:
$validity_filter = array(
'email' => array(
'filter' => FILTER_VALIDATE_EMAIL,
'flags' => FILTER_REQUIRE_SCALAR
),
'from' => array(
'filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_REQUIRE_SCALAR,
'options' => array('min_range' => 1964, 'max_range' => 2009)),
'to' => array(
'filter' => FILTER_VALIDATE_INT,
'flags' => FILTER_REQUIRE_SCALAR,
'options' => array('min_range' => 1964, 'max_range' => 2009))
);
// filter all ignored fields
$validity_filter = array_diff_key($validity_filter, $ignore_fields);
$validity_filtered = filter_input_array(INPUT_GET | INPUT_POST,
$required_filter);
foreach($validity_filter as $field => $value){
if($value === false){ // NULL values are checked in a previous step
$errors[$field] = $validity_errors[$field]; // show error
$returnvalues[$field] = $_REQUEST[$field]; // return original value
} else {
$returnvalues[$field] = $value; // return filtered value
}
}
// process possible errors and response values