Нужно по get запросу отфильтровать список людей. К примеру get такой: site.loc/index.php?birthday_from=33&birthday_to=55&height_from=99
В index.php прописал так:
<?php header("Content-Type: text/html; charset=utf-8");
if ( isset( $_REQUEST['birthday_from']) && !empty( $_REQUEST['birthday_from']) ) {
$request_arr[0][] = (int)$_REQUEST['birthday_from'];
}
if ( isset( $_REQUEST['birthday_to']) && !empty( $_REQUEST['birthday_to']) ) {
$request_arr[0][] = (int)$_REQUEST['birthday_to'];
}
if ( isset( $_REQUEST['height_from']) && !empty( $_REQUEST['height_from']) ) {
$request_arr[1][] = (int)$_REQUEST['height_from'];
}
if ( isset( $_REQUEST['height_to']) && !empty( $_REQUEST['height_to']) ) {
$request_arr[1][] = (int)$_REQUEST['height_to'];
}
/* инициализируем список пользователей */
$user_list = array(
0 => array('name'=>'Ирина', 'birthday'=>35, 'height'=>155),
1 => array('name'=>'Максим', 'birthday'=>22, 'height'=>''),
2 => array('name'=>'Дмитрий', 'birthday'=>15, 'height'=>122)
);
/* отображаем пользователей */
foreach($user_list as $k => $user)
{
/* отображаем пользователей по нашему get запросу */
if ( !empty($user_list[$k]['birthday']) )
{
$candidate_age = $user_list[$k]['birthday'];
}
else
{
$candidate_age = 0;
}
if ( !empty($user_list[$k]['height']) )
{
$height = $user_list[$k]['height'];
}
else
{
$height = 0;
}
echo '
'.$k;
/* отображаем если в get запросе все параметры указаны */
if ( (!empty($request_arr[0][0]) && ($candidate_age >= $request_arr[0][0]))
&& (!empty($request_arr[0][1]) && ($candidate_age <= $request_arr[0][1]))
&& (!empty($request_arr[1][0]) && ($height >= $request_arr[1][0]))
&& (!empty($request_arr[1][1]) && ($height <= $request_arr[1][1]))
)
{
var_dump($user);
}/* отображаем если в get запросе не все параметры указаны */
elseif ( (!empty($request_arr[0][0]) && empty($request_arr[0][1]) && ($candidate_age >= $request_arr[0][0]))
|| (!empty($request_arr[0][1]) && empty($request_arr[0][0]) && ($candidate_age <= $request_arr[0][1]))
|| (!empty($request_arr[1][0]) && empty($request_arr[1][1]) && ($height >= $request_arr[1][0]))
|| (!empty($request_arr[1][1]) && empty($request_arr[1][0]) && ($height <= $request_arr[1][1]))
)
{
echo 'не все параметры указаны '; var_dump($user); echo '';
}/* отображаем если в get запросе ни один параметр не указан */
elseif ( !isset($request_arr) )
{
echo 'ни один параметр не указан '; var_dump($user); echo '';
}
}
На выходе получим:
0
не все параметры указаны array(3) {
["name"]=>
string(10) "Ирина"
["birthday"]=>
int(35)
["height"]=>
int(155)
}
1
2
не все параметры указаны array(3) {
["name"]=>
string(14) "Дмитрий"
["birthday"]=>
int(15)
["height"]=>
int(122)
}
Получается выводится 1 лишний пользователь Дмитрий, т. к. в запросе у нас от 33 лет (а в массиве ему 15). И самое главное, когда параметры в get будем добавлять условие тоже будет увеличиваться, а хотелось бы как-нибудь универсально прописать без этого увеличения условий. Можете посоветовать как это решить?
PHP
На php нужно написать универсальное условие для фильтрации данных
1. isset при проверке $_REQUEST совершенно не нужны: empty прекрасно обрабатывает не существующие переменные.
2. Ты сильно перемудрил с проверкой и умудрился перечислить далеко не все варианты: твоя программа не обрабатывает случаи, когда задано одно условие, три условия, задано два условия по одному параметру. Из 16 комбинаций условий у тебя проверяется только 5.
foreach ($user_list as $val) {
if ((empty($val['birthday'])
|| (empty($_GET['birthday_from']) || $val['birthday'] >= $_GET['birthday_from'])
&& (empty($_GET['height_to']) || $val['birthday'] <= $_GET['birthday_to']))
&& (empty($val['height'])
|| (empty($_GET['height_from']) || $val['height'] >= $_GET['height_from'])
&& (empty($_GET['height_to']) || $val['height'] <= $_GET['height_to']))) {
var_dump($val);
}
}
Или так:
function filter($from, $to) {
switch (empty($from) + 2 * empty($to)) {
case 0: return function($val) use ($from, $to) { return empty($val) || $val >= $from && $val <= $to; };
case 1: return function($val) use ($to) { return empty($val) || $val <= $to; };
case 2: return function($val) use ($from) { return empty($val) || $val >= $from; };
case 3: return function($val) { return true; };
}
$birthday = filter($_GET['birthday_from'], $_GET['birthday_to']);
$height = filter($_GET['height_from'], $_GET['height_to']);
foreach ($user_list as $val) {
if ($birthday($val['birthday']) && $height($val['height']) { var_dump($val); }
}
2. Ты сильно перемудрил с проверкой и умудрился перечислить далеко не все варианты: твоя программа не обрабатывает случаи, когда задано одно условие, три условия, задано два условия по одному параметру. Из 16 комбинаций условий у тебя проверяется только 5.
foreach ($user_list as $val) {
if ((empty($val['birthday'])
|| (empty($_GET['birthday_from']) || $val['birthday'] >= $_GET['birthday_from'])
&& (empty($_GET['height_to']) || $val['birthday'] <= $_GET['birthday_to']))
&& (empty($val['height'])
|| (empty($_GET['height_from']) || $val['height'] >= $_GET['height_from'])
&& (empty($_GET['height_to']) || $val['height'] <= $_GET['height_to']))) {
var_dump($val);
}
}
Или так:
function filter($from, $to) {
switch (empty($from) + 2 * empty($to)) {
case 0: return function($val) use ($from, $to) { return empty($val) || $val >= $from && $val <= $to; };
case 1: return function($val) use ($to) { return empty($val) || $val <= $to; };
case 2: return function($val) use ($from) { return empty($val) || $val >= $from; };
case 3: return function($val) { return true; };
}
$birthday = filter($_GET['birthday_from'], $_GET['birthday_to']);
$height = filter($_GET['height_from'], $_GET['height_to']);
foreach ($user_list as $val) {
if ($birthday($val['birthday']) && $height($val['height']) { var_dump($val); }
}
1. у тебя есть массив с данными
2. у тебя есть критерий отбора
вот и проходи массив, проверяй каждую запись массива с условием и формируй новый с выбранными данными..
а у тебя прям борода бородатая.. каких то условий куча.. зачем?
2. у тебя есть критерий отбора
вот и проходи массив, проверяй каждую запись массива с условием и формируй новый с выбранными данными..
а у тебя прям борода бородатая.. каких то условий куча.. зачем?
Похожие вопросы
- При написании php кода для отправки записи в базу данных выходит ошибка
- Хочу начать изучать PHP. Нужно ли перед этим изучить HTML?
- PHP не видит данных POST запроса
- Если нужно создать сайт с использованием php,то index страница должна быть написана на php?
- Хочу работать php программистом. Но как узнать - готов я или нет? На php же можно очень много написать, в отличие от JS.
- Нужна помощь c запросами и базой данных, PHP, MySQL
- Нужно ли знать HTML, чтобы учить PHP ?
- Отправка текста в базу данных PHP + MySQL! Помогите ((
- PHP Polling ChatGPT
- Как оптимизировать структуру сайта php. на готовом шаблоне