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 :: Версия для печати :: Поис по значений в масиве, array_filter
Форумы портала PHP.SU » » Вопросы новичков » Поис по значений в масиве, array_filter

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

1. gorilas - 03 Марта, 2016 - 09:08:10 - перейти к сообщению
есть многомерный масив
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.  

А оно не хочет работать подскажите что здесь не так?
2. freelsd - 04 Марта, 2016 - 12:21:16 - перейти к сообщению
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).
3. Мелкий - 04 Марта, 2016 - 14:00:13 - перейти к сообщению
Ну а если не насиловать ископаемые версии 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. });
4. gorilas - 05 Марта, 2016 - 21:27:01 - перейти к сообщению
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 только местами поменял.

 

Powered by ExBB FM 1.0 RC1