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 :: Поис по значений в масиве, array_filter

 PHP.SU

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


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

> Описание: нужно перебрать масив на значения взятые из другого масива
gorilas
Отправлено: 03 Марта, 2016 - 09:08:10
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Окт. 2015  


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




есть многомерный масив
PHP:
скопировать код в буфер обмена
  1.  
  2. $myd = Array (
  3. '0' => Array ( 'id' =>' 3093', 'photo' =>' files/catalog/3093_s.png' ),
  4. '1' => Array ( 'id' =>' 2936', 'photo' =>' files/catalog/2936_s.png' ),
  5. '2' => Array ( 'id' =>' 2921', 'photo' =>' files/catalog/2936_s.png' )
  6. );
  7.  

нужно перебрать этот масив по id, пример
PHP:
скопировать код в буфер обмена
  1.  
  2.  function odd($var) {
  3.         return ($myd['id'] != '3093');
  4.  
  5.  $myd2 = array_filter($myd, 'odd');
  6.  

масив myd2 без записи с id =3093.
Но задача требует перебрать масив не по одному id а по нескольким
начал усложнять
создал масив $qwerty с id

и пытаюсь их подставлять в фунцкии odd
PHP:
скопировать код в буфер обмена
  1.  
  2. $qwer
  3. ty = Array ( '0'=> '3093', '1'=>'2936', '2'=>'2947');
  4. ////
  5.  function odd($var) {
  6.         $qwe = true;
  7.         foreach ($qwerty as &$value){
  8.                 //foreach($qwerty as $key => $value){
  9.                        
  10.                 if ( $var['id'] == $value ){   
  11.                  $qwe = false;
  12.                   break;
  13.                 }
  14.                        
  15.             }
  16.  return ($qwe );
  17.  }
  18.  

А оно не хочет работать подскажите что здесь не так?
 
 Top
freelsd
Отправлено: 04 Марта, 2016 - 12:21:16
Post Id


Гость


Покинул форум
Сообщений всего: 108
Дата рег-ции: Февр. 2015  


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




PHP:
скопировать код в буфер обмена
  1.  
  2. $myd = Array (
  3.         '0' => Array ( 'id' =>' 3093', 'photo' =>' files/catalog/3093_s.png' ),
  4.         '1' => Array ( 'id' =>' 2936', 'photo' =>' files/catalog/2936_s.png' ),
  5.         '2' => Array ( 'id' =>' 2921', 'photo' =>' files/catalog/2936_s.png' )
  6.         );
  7.  
  8. $elements_list = array(2936, 2921);
  9.  
  10. function exclude_elements($var){
  11.         global $elements_list;
  12.         foreach($elements_list as $element){
  13.                 if( (int)$var['id'] === $element ){
  14.                         return false;
  15.                 }
  16.         }
  17.         return true;
  18. }
  19.  
  20.  
  21. $result = array_filter($myd, 'exclude_elements');
  22. print_r($result);
  23.  



Через global в функию передаются элементы, которые нужно отфильтровать (в вашем же случае ничего не работало, потому что функция odd не знала ни про какой массив $qwerty - для нее он был локальным), потом применяем функцию ко всем элементам исходного массива. Кроме того у вас id почему-то является строковой переменной: '3093' вместо 3093, поэтому элементы приводятся к целочисленному типу (int).
 
 Top
Мелкий Супермодератор
Отправлено: 04 Марта, 2016 - 14:00:13
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Ну а если не насиловать ископаемые версии PHP, то нормальным замыканием

PHP:
скопировать код в буфер обмена
  1. $result = array_filter($myd, function ($var) use ($elements_list) {
  2.     foreach($elements_list as $element){
  3.         if($var['id'] == $element) {
  4.             return false;
  5.         }
  6.     }
  7.     return true;
  8. });


-----
PostgreSQL DBA
 
 Top
gorilas
Отправлено: 05 Марта, 2016 - 21:27:01
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Окт. 2015  


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




freelsd пишет:
что функция odd не знала ни про какой массив $qwerty - для нее он был локальным)

Да спасибо, вроде и очевидно, а вот незаметил.
(Добавление)
Мелкий пишет:
Ну а если не насиловать ископаемые версии PHP, то нормальным замыканием

PHP:
скопировать код в буфер обмена
  1. $result = array_filter($myd, function ($var) use ($elements_list) {
  2.     foreach($elements_list as $element){
  3.         if($var['id'] == $element) {
  4.             return false;
  5.         }
  6.     }
  7.     return true;
  8. });

Ваш код подходит замечательно ! СПС.
False и true только местами поменял.
 
 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