Создать форму фильтра для списка в PHP - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть форма с 6 полями для фильтрации списка массивов в PHP.

При отправке формы я хочу, чтобы фильтр был применен к списку и отображал только те записи, которые соответствуют вводу 6 полей.

Я использую filter_array (), но мне нужен код для применения всех фильтров.

Кто-нибудь может мне помочь?

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

Мой массив выглядит так

$o[] = array ('Sagsnummer' =>31400, 'Prod.ordrenummer' => 0101, 'Status' => "Ordre", 'Fase' => "Produktion", 'Projektleder' => "RALF", 'Montageleder' => "JALU");
$o[] = array ('Sagsnummer' =>31400, 'Prod.ordrenummer' => 0102, 'Status' => "Ordre", 'Fase' => "Produktion", 'Projektleder' => "RALF", 'Montageleder' => "JALU");
$o[] = array ('Sagsnummer' =>31400, 'Prod.ordrenummer' => 0103, 'Status' => "Ordre", 'Fase' => "Produktion", 'Projektleder' => "RALF", 'Montageleder' => "JALU");
$o[] = array ('Sagsnummer' =>35683, 'Prod.ordrenummer' => 0101, 'Status' => "Ordre", 'Fase' => "Produktion", 'Projektleder' => "EHA", 'Montageleder' => "DEKA");
$o[] = array ('Sagsnummer' =>35683, 'Prod.ordrenummer' => 0102, 'Status' => "Ordre", 'Fase' => "Produktion", 'Projektleder' => "EHA", 'Montageleder' => "DEKA");
$o[] = array ('Sagsnummer' =>35683, 'Prod.ordrenummer' => 0103, 'Status' => "Ordre", 'Fase' => "Produktion", 'Projektleder' => "EHA", 'Montageleder' => "DEKA");
$o[] = array ('Sagsnummer' =>36180, 'Prod.ordrenummer' => 0101, 'Status' => "Ordre", 'Fase' => "Produktion", 'Projektleder' => "EHA", 'Montageleder' => "JALU");
$o[] = array ('Sagsnummer' =>36193, 'Prod.ordrenummer' => 0101, 'Status' => "Ordre", 'Fase' => "Produktion", 'Projektleder' => "MKJE", 'Montageleder' => "HJHS");
$o[] = array ('Sagsnummer' =>31400, 'Prod.ordrenummer' => 0104, 'Status' => "Ordre", 'Fase' => "Produktion", 'Projektleder' => "RALF", 'Montageleder' => "JALU");
$o[] = array ('Sagsnummer' =>31400, 'Prod.ordrenummer' => 0105, 'Status' => "Ordre", 'Fase' => "Produktion", 'Projektleder' => "RALF", 'Montageleder' => "JALU");
$o[] = array ('Sagsnummer' =>31400, 'Prod.ordrenummer' => 0106, 'Status' => "Ordre", 'Fase' => "Produktion", 'Projektleder' => "RALF", 'Montageleder' => "JALU");
$o[] = array ('Sagsnummer' =>36193, 'Prod.ordrenummer' => 0102, 'Status' => "Ordre", 'Fase' => "Produktion", 'Projektleder' => "MKJE", 'Montageleder' => "HJHS");

Поля фильтра называются

$fsagsnr;
$forside;
$status;
$fase;
$fprojektleder;
$fmontageleder;

Я вызываю filter_array () с помощью

$new_array = array_filter($o, array(new Filter($fsagsnr, $forside, $status, $fase, $fprojektleder), 'filter'));

И мой класс Filter выглядит следующим образом

class Filter {
  private $sagsnr;
  private $forside;
  private $status;
  private $fase;
  private $projektleder;

  function __construct($sn,$fo,$st,$fa,$pl) {
    $this->sagsnr = $sn;
    $this->forside = $fo;
    $this->status = $st;
    $this->fase = $fa;
    $this->projektleder = $pl;
  }

  function filter($i) {
    $result = false;
    if($this->sagsnr != "" && ($i["Sagsnummer"] == $this->sagsnr)) $result = true;
    elseif($this->forside != "" && ($i["Prod.ordrenummer"] == $this->forside)) $result = true;
    return $result;
  }
}

SOLUTION

Теперь в моей функции фильтра есть только один оператор If.

if(($this->sagsnr == "" || $i["Sagsnummer"] == $this->sagsnr) && ($this->forside == "" || $i["Prod.ordrenummer"] == $this->forside) && ($this->status == "" || $i["Status"] == $this->status) && ($this->fase == "" || $i["Fase"] == $this->fase) && ($this->projektleder == "" || $i["Projektleder"] == $this->projektleder) && ($this->montageleder == "" || $i["Montageleder"] == $this->montageleder)) $result = true;

1 Ответ

0 голосов
/ 10 апреля 2019

Мне удалось применить первое поле с помощью оператора If, но как только я применил второе поле, список теперь содержит записи, которые не заполняют первый фильтр.

Это потому, что если эта первая проверка приводит к «true», она не переходит ни в какие другие ветви / else-if.

Вы должны проверить все свои условия за один раз, а не как альтернативы друг другу.

Соедините отдельные условия вместе, используя логическое И, а затем назначьте значение $ result на основании этого. Но вам нужно будет позаботиться о случаях, когда значение поиска не указывалось индивидуально каждый раз, поэтому ваше первое условие станет

$this->sagsnr == "" || ($this->sagsnr != "" && ($i["Sagsnummer"] == $this->sagsnr))

, чтобы охватить оба этих случая. Сделайте это для всех и присоединитесь к ним с && - и не забудьте поставить групповые скобки вокруг каждого набора.

(хотя это может быть сжато до $this->sagsnr == "" || $i["Sagsnummer"] == $this->sagsnr, поскольку PHP будет оценивать вторую часть условий ||, связанных с присоединением, только если первая была ложной для начала.)

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