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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Что-то вроде блэк и вайтлистов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
kir55rus
Отправлено: 10 Апреля, 2013 - 19:46:05
Post Id


Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Янв. 2012  
Откуда: Омск, Россия


Помог: 0 раз(а)




Здравствуйте. Есть массив:

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]


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


Итак, мне надо сделать следующее:
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);



Но я не считаю это лучшим вариантом. Подскажите, как переделать функцию
Заранее благодарен
 
 Top
OrmaJever Модератор
Отправлено: 10 Апреля, 2013 - 20:28:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




если я правельно понял
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-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
kir55rus
Отправлено: 11 Апреля, 2013 - 11:00:01
Post Id


Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Янв. 2012  
Откуда: Омск, Россия


Помог: 0 раз(а)




OrmaJever, Спасибо огромное!
Но в Вашем примере нужно убрать инверсию перед in_array, когда идет проверка по вайтлисту

Все работает Улыбка
 
 Top
OrmaJever Модератор
Отправлено: 11 Апреля, 2013 - 11:04:43
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




я не понял что делать с вайт листом, удалять те которые там есть или наоборот.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB