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

sanu0074

Новичок
Получил я массив, и в нем мне нужно было найти объект, я нашел его таким образом:
PHP:
function func_f($arr) {
        foreach ($arr as $el) {
            if (is_array($el)) {func_f($el);}
            else{
                if(is_object($el)){
                    my_func((array) $el);
                }
            }
        }
        }
Данная функция найденный объект передает в виде массива в другую ф-ю my_func(), пример такого массива в файле, прикрепил.
Задача в том чтобы достать эти элементы, самые корневые:
Код:
[0] => Array
                                                (
                                                    [0] => Получение данных о запущенных приложениях
                                                    [1] => Приложение сможет получать информацию о недавно запущенных и выполняемых задачах, а следовательно, и о приложениях, используемых на устройстве.
                                                    [2] => 1
                                                )
их три в каждом, и условие - доставать только те, у которых третий элемент равен единице ([2] => 1)
Как пограмотнее составить такую функцию? я запутался уже..
 

Вложения

hell0w0rd

Продвинутый новичок
Берешь код, выкладываешь там, сюда ссылку. Никто твой архив скачивать не будет.
 

sanu0074

Новичок
написал такую фигню:
PHP:
        function my_func($arr){
            if(count($arr)==3  && isset($arr[2]) && $arr[2]==1 && strlen($arr[0])>0 && !is_array($arr[1])){
                print_r($arr);
            }
            if (is_array($arr)) {
              foreach ($arr as $key => $value) {
                my_func($arr[$key]);
              }
            }
        }
Не знаю хорошо или плохо, но работает)
 

vasinsky

Новичок
sanu0074, у меня длиннее))

PHP:
  function findInArray($array){
      static $res = array();
      static $i;
    
      $i++;

      if(!is_array($array) && $i != 1){
          return array('success'=>false, 'error'=>'Необходим массив');
      }
      else{
        foreach($array as $k=>$v){

            if(is_array($v) && count($v) == 3 && isset($v[2]) && $v[2] == 1){
                    $res[] = $v;
            }
            else{
                findInArray($v);
            }
          
        }
      }
    
      return !empty($res) ? array('success'=>true, 'data'=>$res) : array('success'=>false, 'error'=>'Ничего не найдено');
  }
 
Последнее редактирование:

sanu0074

Новичок
вот в принципе такой у меня окончательный вариант получился:
PHP:
function func($arr){      
            if(count($arr)==3){
                if(!is_array($arr[0]) && !is_array($arr[1]) && !is_array($arr[2])){
                    if($arr[2]==1){
                        unset($arr[2]);
                        print_r($arr);
                    }
                }
            }
            if (is_array($arr)) {
              foreach ($arr as $key => $value) {
                func($arr[$key]);
              }
            }
        }
 

vasinsky

Новичок
а не.. если от многого абстрагироваться, то так

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;
  }
вернёт:
false - если входной параметр не массив
null - если ничего не найдёт
массив - соберёт всё что нашлось
 

Вурдалак

Продвинутый новичок
Почитай по type hinting, попробуй объяснить чем пустой массив отличается от null, попробуй подумать, что будет, если функцию вызвать 2 раза.
 

hell0w0rd

Продвинутый новичок
Мы в 2014 году, можно взять и кинуть исключение, а не договариваться о возвращаемых значениях;)
 

vasinsky

Новичок
можно конечно) а если мне результат работы нужно потом использовать - то уже не пойдёт
 

sanu0074

Новичок
Ребят, вот я столкнулся еще с такой задачей, собственно код который получился:
PHP:
        $output = array();

        function findObj($arr) {
          foreach ($arr as $el) {
            if (is_array($el)) {trace($el);}
            else{
                if(is_object($el)){
                    $arr = (array) $el;
                    unpacked(array_shift($arr));
                }
            }
          }
        }  
      
        function unpacked($arr){
            if(count($arr)==3){
                if(!is_array($arr[0]) && !is_array($arr[1]) && !is_array($arr[2])){
                    if(isset($arr[2])){unset($arr[2]);}
                    print_r($arr);
                }
            }
            if (is_array($arr)) {
              foreach ($arr as $key => $value) {
                unpacked($arr[$key]);
              }
            }
        }
      
        findObj($data);

        var_dump($output);
Мне надо как-то результат работы функций записать в результирующий массив $output. Т.к. глобальными переменными не воспользоваться, как решить эту задачу?
p.s. естественно тут уже не будет print_r($arr); внутри unpacked()
 

vasinsky

Новичок
моя функция и находит и собирает.
если не хочешь её использовать - посмотри как в ней происходит наполнение массива $res - в том числе во время рекурсии
 

sanu0074

Новичок
интересно, можно ли ссылкой как то сделать, или что то на подобие как работает функция array_push($arr,$val).....
 

vasinsky

Новичок
ссылкой - ты будешь влиять на входной массив

я задачу не понял) изначально - нужно было собрать конкретные массивы в один общий массив. щас что изменилось?
 
Сверху