original_string: public function add(navigation_node $node, $beforekey=null) {
          global $CFG;
          $key = $node->key;
          $type = $node->type;
  
          // First check we have a 2nd dimension for this type
          if (!array_key_exists($type, $this->orderedcollection)) {
              $this->orderedcollection[$type] = array();
          }
          // Check for a collision and report if debugging is turned on
          if ($CFG->debug && array_key_exists($key, $this->orderedcollection[$type])) {
              debugging('Navigation node intersect: Adding a node that already exists '.$key, DEBUG_DEVELOPER);
          }
  
          // Find the key to add before
          $newindex = $this->count;
          $last = true;
          if ($beforekey !== null) {
              foreach ($this->collection as $index => $othernode) {
                  if ($othernode->key === $beforekey) {
                      $newindex = $index;
                      $last = false;
                      break;
                  }
              }
              if ($newindex === $this->count) {
                  debugging('Navigation node add_before: Reference node not found ' . $beforekey .
                          ', options: ' . implode(' ', $this->get_key_list()), DEBUG_DEVELOPER);
              }
          }
  
          // Add the node to the appropriate place in the by-type structure (which
          // is not ordered, despite the variable name)
          $this->orderedcollection[$type][$key] = $node;
          if (!$last) {
              // Update existing references in the ordered collection (which is the
              // one that isn't called 'ordered') to shuffle them along if required
              for ($oldindex = $this->count; $oldindex > $newindex; $oldindex--) {
                  $this->collection[$oldindex] = $this->collection[$oldindex - 1];
              }
          }
          // Add a reference to the node to the progressive collection.
          $this->collection[$newindex] = $this->orderedcollection[$type][$key];
          // Update the last property to a reference to this new node.
          $this->last = $this->orderedcollection[$type][$key];
  
          // Reorder the array by index if needed
          if (!$last) {
              ksort($this->collection);
          }
          $this->count++;
          // Return the reference to the now added node
          return $node;
      }
code: public function add(navigation_node $node, $beforekey=null) {
          global $CFG;
          $key = $node->key;
          $type = $node->type;
  
          // First check we have a 2nd dimension for this type
          if (!array_key_exists($type, $this->orderedcollection)) {
              $this->orderedcollection[$type] = array();
          }
          // Check for a collision and report if debugging is turned on
          if ($CFG->debug && array_key_exists($key, $this->orderedcollection[$type])) {
              debugging('Navigation node intersect: Adding a node that already exists '.$key, DEBUG_DEVELOPER);
          }
  
          // Find the key to add before
          $newindex = $this->count;
          $last = true;
          if ($beforekey !== null) {
              foreach ($this->collection as $index => $othernode) {
                  if ($othernode->key === $beforekey) {
                      $newindex = $index;
                      $last = false;
                      break;
                  }
              }
              if ($newindex === $this->count) {
                  debugging('Navigation node add_before: Reference node not found ' . $beforekey .
                          ', options: ' . implode(' ', $this->get_key_list()), DEBUG_DEVELOPER);
              }
          }
  
          // Add the node to the appropriate place in the by-type structure (which
          // is not ordered, despite the variable name)
          $this->orderedcollection[$type][$key] = $node;
          if (!$last) {
              // Update existing references in the ordered collection (which is the
              // one that isn't called 'ordered') to shuffle them along if required
              for ($oldindex = $this->count; $oldindex > $newindex; $oldindex--) {
                  $this->collection[$oldindex] = $this->collection[$oldindex - 1];
              }
          }
          // Add a reference to the node to the progressive collection.
          $this->collection[$newindex] = $this->orderedcollection[$type][$key];
          // Update the last property to a reference to this new node.
          $this->last = $this->orderedcollection[$type][$key];
  
          // Reorder the array by index if needed
          if (!$last) {
              ksort($this->collection);
          }
          $this->count++;
          // Return the reference to the now added node
          return $node;
      }
code_tokens: public function add ( navigation_node $ node , $ beforekey = null ) { global $ CFG ; $ key = $ node -> key ; $ type = $ node -> type ; // First check we have a 2nd dimension for this type if ( ! array_key_exists ( $ type , $ this -> orderedcollection ) ) { $ this -> orderedcollection [ $ type ] = array ( ) ; } // Check for a collision and report if debugging is turned on if ( $ CFG -> debug && array_key_exists ( $ key , $ this -> orderedcollection [ $ type ] ) ) { debugging ( 'Navigation node intersect: Adding a node that already exists ' . $ key , DEBUG_DEVELOPER ) ; } // Find the key to add before $ newindex = $ this -> count ; $ last = true ; if ( $ beforekey !== null ) { foreach ( $ this -> collection as $ index => $ othernode ) { if ( $ othernode -> key === $ beforekey ) { $ newindex = $ index ; $ last = false ; break ; } } if ( $ newindex === $ this -> count ) { debugging ( 'Navigation node add_before: Reference node not found ' . $ beforekey . ', options: ' . implode ( ' ' , $ this -> get_key_list ( ) ) , DEBUG_DEVELOPER ) ; } } // Add the node to the appropriate place in the by-type structure (which // is not ordered, despite the variable name) $ this -> orderedcollection [ $ type ] [ $ key ] = $ node ; if ( ! $ last ) { // Update existing references in the ordered collection (which is the // one that isn't called 'ordered') to shuffle them along if required for ( $ oldindex = $ this -> count ; $ oldindex > $ newindex ; $ oldindex -- ) { $ this -> collection [ $ oldindex ] = $ this -> collection [ $ oldindex - 1 ] ; } } // Add a reference to the node to the progressive collection. $ this -> collection [ $ newindex ] = $ this -> orderedcollection [ $ type ] [ $ key ] ; // Update the last property to a reference to this new node. $ this -> last = $ this -> orderedcollection [ $ type ] [ $ key ] ; // Reorder the array by index if needed if ( ! $ last ) { ksort ( $ this -> collection ) ; } $ this -> count ++ ; // Return the reference to the now added node return $ node ; }
docstring: Adds a navigation node to the collection
  
  @param navigation_node $node Node to add
  @param string $beforekey If specified, adds before a node with this key,
  otherwise adds at end
  @return navigation_node Added node
docstring_tokens: Adds a navigation node to the collection