Рекурсивный поиск в массиве

sanu0074

Новичок
в начале есть массив $output, в него нужно собрать результаты. Если бы это все происходило без использования функций, то можно было бы использовать там где в unpacked(), print_r($arr) - .array_push($output,$arr)... А так, внутри функции невозможно получить доступ к $output. В принципе в этом вся соль....
 

vasinsky

Новичок
не понял, а чем запись результата работы функции в $output не подходит?

PHP:
  function findInArray($array){
      if(!is_array($array))
          return false;
     
      static $res = array(); 
     
      foreach($array as $k=>$v){
          (is_array($v) && count($v) == 3 && isset($v[2]) && $v[2] == 1)
          ? $res[] = $v
          : findInArray($v);
      }

      return ($res) ? $res : null;
  }
   //Массив над которым проводятся операции
  $arr = array(
      'test'=>array(
        array('1+',2,1),
        array('1++',2,1),
        'test'=>array(array('1-',2,1),array('1--',2,1),2)
      ),
      array('1+++',2,1),
      range('a','g'),
      array(range(3,4),array('1++++',2,1))
  );
   
  //Результат
  $output = findInArray($arr);
 

sanu0074

Новичок
Ну вот, сделал вашу функцию, возвращает пустоту:
PHP:
        function findObj($arr) {       
          foreach ($arr as $el) {
            if (is_array($el)) {trace($el);}
            else{
                if(is_object($el)){
                    $arr = (array) $el;
                    return unpacked(array_shift($arr));
                }
            }
          }
        }   
       
        function unpacked($array){      
          if(!is_array($array))
              return false;
       
          static $res = array();
       
          foreach($array as $k=>$v){
              (is_array($v) && count($v) == 3 && isset($v[2]) && $v[2] == 1)
              ? $res[] = $v
              : unpacked($v);
          }
   
          return ($res) ? $res : null;
        }
       
        print_r(findObj($data));
поэтому я и говорю о том что написал выше (про ссылку или принцип как работает $array_push())
 

vasinsky

Новичок
так)) я не говорил её использовать в группе с вашей, а во вторых - она выполняет функционал первой из ваших 2х.

я же сказал - моя функция - принимает на вход массив и в процессе работы находит в нём нужные массивы - и собирает результирующий массив $res
 

sanu0074

Новичок
так)) я не говорил её использовать в группе с вашей, а во вторых - она выполняет функционал первой из ваших 2х.

я же сказал - моя функция - принимает на вход массив и в процессе работы находит в нём нужные массивы - и собирает результирующий массив $res
Как ее встроить в группу моих функций?
Объект конвертируется в массив здесь: $arr = (array) $el;
и тут же необходимо пройтись по массиву и найти нужные элементы не выходя из функции, потому что если сначала вернуть объект а потом делать действия то возвращается значение пустота:
PHP:
        function findObj($arr) {           
          foreach ($arr as $el) {
            if (is_array($el)) {trace($el);}
            else{
                if(is_object($el)){
                    $arr = (array) $el;
                    return $arr;
                }
            }
          }
        }   
       
        exit(print_r(findObj($data)));
т.е. тут в unpacked нечего передавать, работает только тогда, когда сразу передается всё в unpacked(): unpacked(array_shift($arr));
 

sanu0074

Новичок
Даже так, выводится пустота:
PHP:
        function findObj($arr) {           
          foreach ($arr as $el) {
            if (is_array($el)) {findObj($el);}
            else{
                if(is_object($el)){
                    $arr = (array) $el;
                    return unpacked(array_shift($arr));
                }
            }
          }
        }   
       
        function unpacked($arr){       
            return $arr;
           
        }
       
        $arr = findObj($data);
        print_r($arr);
 

vasinsky

Новичок
может так?

PHP:
  function findInArray($array){
      if(!is_array($array))
          return false;
   
      static $res = array();
   
      foreach($array as $k=>$v){
          $v = is_object($v) ? (array) $v : $v;
          (is_array($v) && count($v) == 3 && isset($v[2]) && $v[2] == 1)
          ? $res[] = $v
          : findInArray($v);
      }

      return ($res) ? $res : null;
  }
 

sanu0074

Новичок
да, делает как надо, но, непонятно почему, если делать print_r() внутри findObj() - то выводит нужный результат, а если сделать return - то пустота возвращается?

Вот так выводит:
PHP:
        function findObj($arr) {          
          foreach ($arr as $el) {
            if (is_array($el)) {findObj($el);}
            else{
                if(is_object($el)){
                    $arr = (array) $el;
                    exit(print_r( unpacked(array_shift($arr))));
                }
            }
          }
        }  
      
        function unpacked($array){      
              if(!is_array($array))
                return false;
        
              static $res = array();
              foreach($array as $k=>$v){
                  $v = is_object($v) ? (array) $v : $v;
                  (is_array($v) && count($v) == 3 && !is_array($v[2]) && !is_array($v[1]) && !is_array($v[0]))
                  ? $res[] = $v
                  : unpacked($v);
              }
              return ($res) ? $res : NULL;          
        }
А так возвращает пустоту:
PHP:
        function findObj($arr) {         
          foreach ($arr as $el) {
            if (is_array($el)) {findObj($el);}
            else{
                if(is_object($el)){
                    $arr = (array) $el;
                    return unpacked(array_shift($arr));
                }
            }
          }
        }  
      
        function unpacked($array){      
              if(!is_array($array))
                return false;
        
              static $res = array();
              foreach($array as $k=>$v){
                  $v = is_object($v) ? (array) $v : $v;
                  (is_array($v) && count($v) == 3 && !is_array($v[2]) && !is_array($v[1]) && !is_array($v[0]))
                  ? $res[] = $v
                  : unpacked($v);
              }
              return ($res) ? $res : NULL;          
        }
      
        print_r(findObj($data));
 

sanu0074

Новичок
А если внутри finObj() вместо return unpacked(array_shift($arr)), сделать exit(print_r(unpacked(array_shift($arr))))
- то выводит наш массив
 

vasinsky

Новичок
exit - останавливает скрипт - следовательно после рекурсии - переменная пропадает просто - от того и NULL

return - делает возврат из функции


почему просто вариант не подходит? просто - одна единственная функция ???

PHP:
function findInArray($array){
      if(!is_array($array))
          return false;

      static $res = array();

      foreach($array as $k=>$v){
          $v = is_object($v) ? (array) $v : $v;
          (is_array($v) && count($v) == 3 && isset($v[2]) && $v[2] == 1)
          ? $res[] = $v
          : findInArray($v);
      }

      return ($res) ? $res : null;
  }
 

С.

Продвинутый новичок
Что за маниакальная любовь к ?: конструкции?

Во-первых, $v = is_object($v) ? (array) $v : $v; сводится к:
$v = (array) $v;

Во-вторых, return ($res) ? $res : null; прекрасно будет работать как:
return $res;

И в-третьих, за
PHP:
          (is_array($v) && count($v) == 3 && isset($v[2]) && $v[2] == 1)
          ? $res[] = $v
          : findInArray($v);
надо бить розгами. Для такого есть нормальный if ().
 

vasinsky

Новичок
Во-первых, $v = is_object($v) ? (array) $v : $v; сводится к:
$v = (array) $v;
особенно если $v - строка или число )))

Что за маниакальная любовь к ?: конструкции?
а у тебя маниакальная ненависть?

особенно когда !isset($res) - это как то не по феншую.

по делу - ничего.

а на счёт розг = это вам к детям своим, не ко мне.
 
Последнее редактирование:
Сверху