All pastes #258157 Raw Edit

Untitled

public text v1 · immutable
#258157 ·published 2006-11-26 05:29 UTC
rendered paste body
<?php
define('WHITE', 0);
define('GREY', 1);
define('BLACK', 2);

$hooks['comment']['nodeapi'] = array();
$hooks['node']['nodeapi'] = array();
$hooks['taxonomy']['nodeapi']['after'] = array('comment');
$hooks['forum']['nodeapi']['before'] = array('node');
$hooks['poll']['nodeapi'] = array('before' => array('forum'), 'after' => array('taxonomy'));

$queue = $current_hook = array();
foreach ($hooks as $module => $element) {
  $current_hook[$module] = $element['nodeapi'];
}

$colors = array();
foreach ($current_hook as $start => $hook) {
  if (isset($hook['after'])) {
    $colors[$start] = WHITE;
    // edges pointing out from this vertex
    foreach ($hook['after'] as $end) {
      $adj[$start][$end] = 1;
      if (!isset($adj[$end])) {
        $adj[$end] = array();
        $colors[$end] = WHITE;
      }
    }
  }
  if (isset($hook['before'])) {
    $colors[$start] = WHITE;
    // edges pointing to this vertex
    if (!isset($adj[$start])) {
      $adj[$start] = array();
    }
    foreach ($hook['before'] as $end) {
      $adj[$end][$start] = 1;
    }
  }
}

function dfs(&$colors, $key, $adj_set = NULL) {
  static $time = 1, $adj, $ordered = array();;
  if (!isset($adj)) {
    $adj = $adj_set;
    return;
  }
  $colors[$key] = GREY;
  foreach (array_keys($adj[$key]) as $new_key) {
    if ($colors[$new_key] == WHITE) {
      dfs($colors, $new_key);
    }
  }
  $colors[$key] = BLACK;
  $ordered[] = $key;
  return $ordered;
}

$ordered = array();
dfs($c, NULL, $adj);

foreach (array_keys($adj) as $key) {
  if ($colors[$key]['color'] == WHITE) {
    $ordered = dfs($colors, $key);
  }
}
var_dump($ordered);