Я фильтрую внешнюю функцию на datatable, у меня работает код, но я чувствую, что он медленный и его можно улучшить. Мне нужно фильтровать по нескольким факторам:
Простое значение поля для таргетинга на столбец в базе данных (отсутствует в представлении с датами)
Множественный выбор из раскрывающегося списка для целевого столбца в базе данных (отсутствует в представлении с датами)
Множественный выбор из раскрывающегося списка для целевого столбца в базе данных, который также является массивомЗдесь я должен сравнить, что это подмножество целевого массива (отсутствует в представлении с датами)
Вот код PHP:
function customfilter( $data, $field, $filter) {
//IF ARRAY
if ( is_array( $filter ) ) {
$arrayNew = array();
foreach($data as $key => $element){
if ( is_array( $element[$field]["array"]) ) {
if (array_diff($element[$field]["array"], $filter)){
$arrayNew[$key] = $data[$key];
}
}else{
if (in_array($element[$field]["sort"], $filter)){
$arrayNew[$key] = $data[$key];
}
}
}
$data = $arrayNew;
//IF VALUE
}else{
$arrayNew = array();
foreach($data as $key => $element){
if (strpos($element[$field]["sort"],$filter) !== false) {
$arrayNew[$key] = $data[$key];
}
}
$data = $arrayNew;
}
return $data;
}
Здесьэто Jquery:
var customfilter = function() {
var frm_data = $('#searchFrom').serializeArray();
var subData = {};
//POST VALUES ARE SENT USING SAME GET FILE NO NEED TO POST AGAIN
var multiple = {};
var i = 0;
$.each(frm_data, function(key, val) {
var str = val.name;
//CHECK IF FIELD NAME FINISHES WITH MULTIPLE
if (str.match("_multiple")){
//RESET
if (typeof multiple[str] == "undefined") {
multiple[str] = new Array();
i = 0;
}
//EMPTY ARRAY IF NO SELECTION
if(val.value === ''){
multiple[str] = [];
}
multiple[str][i] = val.value;
i++;
subData[val.name] = multiple[str];
}else{
subData[val.name] = val.value;
}
});
myData = subData;
table.table().draw();
}
Где у меня есть цикл, я думаю, это проблема. Я нашел это, но я не уверен, как подать заявку ... Надеюсь, кто-нибудь может помочь.
$data = array_filter( $data, function ( $a ) use ( $field, $filter ) {
return (boolean) preg_match( "/$filter/i", $a[ $field ] );
} );