original_string: protected function prepareTree(array $categories, array $options)
      {
          $tree = array();
          $parents_tree = array();
          $children_tree = array();
          $categories_tree = array();
  
          $parent = isset($options['parent_id']) ? (int) $options['parent_id'] : 0;
  
          foreach ($categories as $category) {
              $children_tree[$category['parent_id']][] = $category['category_id'];
              $parents_tree[$category['category_id']][] = $category['parent_id'];
              $categories_tree[$category['category_id']] = $category;
          }
  
          $max_depth = isset($options['depth']) ? (int) $options['depth'] : count($children_tree);
  
          $process_parents = array();
          $process_parents[] = $parent;
  
          while (count($process_parents)) {
              $parent = array_pop($process_parents);
              $depth = count($process_parents);
  
              if ($max_depth <= $depth || empty($children_tree[$parent])) {
                  continue;
              }
  
              $has_children = false;
  
              $child = current($children_tree[$parent]);
  
              do {
                  if (empty($child)) {
                      break;
                  }
  
                  $category = $categories_tree[$child];
  
                  $category['depth'] = $depth;
                  $category['parents'] = $parents_tree[$category['category_id']];
  
                  $tree[$category['category_id']] = $category;
  
                  if (!empty($children_tree[$category['category_id']])) {
                      $has_children = true;
                      $process_parents[] = $parent;
                      $process_parents[] = $category['category_id'];
                      reset($categories_tree[$category['category_id']]);
                      next($children_tree[$parent]);
                      break;
                  }
              } while ($child = next($children_tree[$parent]));
  
              if (!$has_children) {
                  reset($children_tree[$parent]);
              }
          }
  
          return $tree;
      }
code: protected function prepareTree(array $categories, array $options)
      {
          $tree = array();
          $parents_tree = array();
          $children_tree = array();
          $categories_tree = array();
  
          $parent = isset($options['parent_id']) ? (int) $options['parent_id'] : 0;
  
          foreach ($categories as $category) {
              $children_tree[$category['parent_id']][] = $category['category_id'];
              $parents_tree[$category['category_id']][] = $category['parent_id'];
              $categories_tree[$category['category_id']] = $category;
          }
  
          $max_depth = isset($options['depth']) ? (int) $options['depth'] : count($children_tree);
  
          $process_parents = array();
          $process_parents[] = $parent;
  
          while (count($process_parents)) {
              $parent = array_pop($process_parents);
              $depth = count($process_parents);
  
              if ($max_depth <= $depth || empty($children_tree[$parent])) {
                  continue;
              }
  
              $has_children = false;
  
              $child = current($children_tree[$parent]);
  
              do {
                  if (empty($child)) {
                      break;
                  }
  
                  $category = $categories_tree[$child];
  
                  $category['depth'] = $depth;
                  $category['parents'] = $parents_tree[$category['category_id']];
  
                  $tree[$category['category_id']] = $category;
  
                  if (!empty($children_tree[$category['category_id']])) {
                      $has_children = true;
                      $process_parents[] = $parent;
                      $process_parents[] = $category['category_id'];
                      reset($categories_tree[$category['category_id']]);
                      next($children_tree[$parent]);
                      break;
                  }
              } while ($child = next($children_tree[$parent]));
  
              if (!$has_children) {
                  reset($children_tree[$parent]);
              }
          }
  
          return $tree;
      }
code_tokens: protected function prepareTree ( array $ categories , array $ options ) { $ tree = array ( ) ; $ parents_tree = array ( ) ; $ children_tree = array ( ) ; $ categories_tree = array ( ) ; $ parent = isset ( $ options [ 'parent_id' ] ) ? ( int ) $ options [ 'parent_id' ] : 0 ; foreach ( $ categories as $ category ) { $ children_tree [ $ category [ 'parent_id' ] ] [ ] = $ category [ 'category_id' ] ; $ parents_tree [ $ category [ 'category_id' ] ] [ ] = $ category [ 'parent_id' ] ; $ categories_tree [ $ category [ 'category_id' ] ] = $ category ; } $ max_depth = isset ( $ options [ 'depth' ] ) ? ( int ) $ options [ 'depth' ] : count ( $ children_tree ) ; $ process_parents = array ( ) ; $ process_parents [ ] = $ parent ; while ( count ( $ process_parents ) ) { $ parent = array_pop ( $ process_parents ) ; $ depth = count ( $ process_parents ) ; if ( $ max_depth <= $ depth || empty ( $ children_tree [ $ parent ] ) ) { continue ; } $ has_children = false ; $ child = current ( $ children_tree [ $ parent ] ) ; do { if ( empty ( $ child ) ) { break ; } $ category = $ categories_tree [ $ child ] ; $ category [ 'depth' ] = $ depth ; $ category [ 'parents' ] = $ parents_tree [ $ category [ 'category_id' ] ] ; $ tree [ $ category [ 'category_id' ] ] = $ category ; if ( ! empty ( $ children_tree [ $ category [ 'category_id' ] ] ) ) { $ has_children = true ; $ process_parents [ ] = $ parent ; $ process_parents [ ] = $ category [ 'category_id' ] ; reset ( $ categories_tree [ $ category [ 'category_id' ] ] ) ; next ( $ children_tree [ $ parent ] ) ; break ; } } while ( $ child = next ( $ children_tree [ $ parent ] ) ) ; if ( ! $ has_children ) { reset ( $ children_tree [ $ parent ] ) ; } } return $ tree ; }
docstring: Create a tree structure from an array of categories
  @param array $categories
  @param array $options
  @return array
docstring_tokens: Create a tree structure from an array of categories