Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Что-то вроде блэк и вайтлистов
Форумы портала PHP.SU » » Вопросы новичков » Что-то вроде блэк и вайтлистов

Страниц (1): [1]
 

1. kir55rus - 10 Апреля, 2013 - 19:46:05 - перейти к сообщению
Здравствуйте. Есть массив:

CODE (htmlphp):
скопировать код в буфер обмена
  1. (
  2.     [0] => Array
  3.         (
  4.             [ab] => 79682717
  5.             [prj] => 167
  6.             [idv] => 962166332
  7.             [cat] => 272
  8.         )
  9.  
  10.     [1] => Array
  11.         (
  12.             [ab] => 79630699
  13.             [prj] => 107
  14.             [idv] => 962159779
  15.             [cat] => 272
  16.         )
  17.  
  18.     [2] => Array
  19.         (
  20.             [ab] => 79852698
  21.             [prj] => 14
  22.             [idv] => 962103066
  23.             [cat] => 226
  24.         )
  25. )



и есть черные и белые списки:

Белый список для поля [prj]


Черный список для поля [prj]


Белый список для поля [cat]
CODE (htmlphp):
скопировать код в буфер обмена
  1. -


Черный список для поля [cat]
CODE (htmlphp):
скопировать код в буфер обмена
  1. 226
  2. 147


Итак, мне надо сделать следующее:
1) если есть вайтлист, то проверяем массив и возвращаем его уже без лишних значений
2) если вайта нет, удаляем те элементы массива, которые попадают под блэклист
3) если и черного списка нет, то ничего не делаем

Подскажите, как лучше это реализовать
Пока в уме только такая функция:

PHP:
скопировать код в буфер обмена
  1. function filters($arr, $wlprj, $blprj, $wlcat, $blcat){
  2.        
  3.         for($i=0, $c=count($arr), $cwlprj=count($wlprj), $cblprj=count($blprj), $cwlcat=count($wlcat), $cblcat=count($blcat); $i < $c; $i++){
  4.                
  5.                 if($cwlprj){//если есть белый список [prj]
  6.                         if(!array_search($arr[$i]['prj'], $wlprj)){ array_splice($arr, $i, 1); continue;} //удаляем этот элемент
  7.                 }elseif($cblprj){ //если есть черный лист [prj]
  8.                         if(!array_search($arr[$i]['prj'], $blprj)){ array_splice($arr, $i, 1); continue;} //удаляем этот элемент
  9.                 }
  10.  
  11. //то же самое со списками для [cat]
  12.                
  13.         }
  14.        
  15.         return $arr;
  16. }
  17.  
  18. $wlprj = array(14, 167);
  19. $blprj = array(469, 74);
  20. $wlcat = array();
  21. $blcat = array(226, 147);
  22.  
  23. filters($arr, $wlprj, $blprj, $wlcat, $blcat);



Но я не считаю это лучшим вариантом. Подскажите, как переделать функцию
Заранее благодарен
2. OrmaJever - 10 Апреля, 2013 - 20:28:42 - перейти к сообщению
если я правельно понял
PHP:
скопировать код в буфер обмена
  1. $wlprj = array(14, 167);
  2. $blprj = array(469, 74);
  3. $wlcat = array();
  4. $blcat = array(226, 147);
  5.  
  6. var_dump(array_filter($arr, function($val) use ($wlprj, $blprj, $wlcat, $blcat) {
  7.         return (empty($wlprj) || !in_array($val['prj'], $wlprj)) &&
  8.                          (empty($blprj) || !in_array($val['prj'], $blprj)) &&
  9.                          (empty($wlcat) || !in_array($val['cat'], $wlcat)) &&
  10.                          (empty($blcat) || !in_array($val['cat'], $blcat));
  11. }));
3. kir55rus - 11 Апреля, 2013 - 11:00:01 - перейти к сообщению
OrmaJever, Спасибо огромное!
Но в Вашем примере нужно убрать инверсию перед in_array, когда идет проверка по вайтлисту

Все работает Улыбка
4. OrmaJever - 11 Апреля, 2013 - 11:04:43 - перейти к сообщению
я не понял что делать с вайт листом, удалять те которые там есть или наоборот.

 

Powered by ExBB FM 1.0 RC1