Sql Multi Linked List - PullRequest
       30

Sql Multi Linked List

3 голосов
/ 04 марта 2011

Я пытаюсь отобразить порядок, в котором могут быть предприняты определенные шаги. Некоторые шаги могут быть предприняты одновременно, в то время как другие должны выполняться в определенном порядке. У меня уже есть данные в таблице SQL, и я просто хочу вывести их в массив PHP или что-то еще, чтобы я мог их распечатать.

Данные хранятся в таблице 1 sql, с 2 полями. Первым является stat (который является номером этого блока), вторым - prereq, который идентифицирует предшественника (который был бы некоторым другим stat). Если поле prereq имеет значение null, это отправная точка. Конечная точка - это когда других строк нет.

1-й пример:

status_number    prereq
-------------    -------
3                NULL
4                3
5                4
6                4
7                5
7                6
8                7

Концептуально это выглядит так:

image

Я думаю визуально напечатать это, во-первых, я хочу получить данные в массив PHP с вложенными массивами, где у меня будет 2 статистики по вертикали (в данном случае 5 и 6). Итак, массив будет выглядеть так: (3,4, (5,6), 7,8). Как я могу получить данные в этой форме? Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 15 июня 2011

Я думаю, что это должно работать, хотя я должен признать, что я не проверял это:

# get the data - let the DB handle the ordering
$sql = "SELECT status_number,prereq FROM t ORDER BY prereq, status_number"
$res = mysql_query($sql);

# initialize pre-loop stuff
$status_array = array();
$prev_prereq = '';

# loop through the results
while ($row = mysql_fetch_assoc($res))
{
  # check if the prereq is the same as the previous result, and if so...
  if ($prev_prereq == $row['prereq'])
  {
    # look at the last element in the array
    end($status_array);
    $lastIndex = key($status_array);

    # if it's not an array
    if (! is_array($status_array[lastIndex]))
    {
      #  make it one that contains the value that was in that spot
      $v = $status_array[lastIndex]
      $status_array[lastIndex] = array();
      status_array[$lastIndex][] = $v;
    }

    # then append the status to that array
    status_array[$lastIndex][] = $row['status_number'];

  } else
  # just append the latest status the the end of the status array
  {
    $status_array[] = $row['status_number'];
    $prev_prereq = $row['prereq'];
  }
}
0 голосов
/ 28 мая 2011

Ну вот, может понадобиться немного подправить, хотя

/* fetch the status_numbers and prereqs */
$query = "SELECT status_number, prereq FROM status";
$rs = mysqli_query($dbc, $query);
while ($row = mysqli_fetch_row($rs)) {
    $ids[] = $row[0];
    $fwd[$row[0]][] = $row[1];
}

/* find the endpoint(s) */
$ends = array();
foreach ($ids as $search) {
    $found = false;
    foreach ($fwd as $deps) {
        if (in_array($search, $deps)) {
            $found = true;
            break;
        }
    }
    if ($found)
        continue;
    $ends[] = $search;
}

/* sort the deps so we can string compare */
foreach ($fwd as &$deps)
    asort($deps);

    /* recursive resolve function */
function resolve($fwd, $id, &$output) {
    if (!is_null($id))
        array_unshift($output, $id);

    $count = count($fwd[$id]);
    if ($count == 0)
        return;

    if ($count > 1) {
        $subs = array();
        $groups = array();
        foreach ($fwd[$id] as $dep)
            $subs[$dep] = implode(',', $fwd[$dep]);

        foreach ($subs as $dep => $str1) {
            unset($subs[$index]);
            foreach ($subs as $index => $str2)
                if ($str1 == $str2) {
                    unset($subs[$index]);
                    $groups[$str1][] = $index;
                }
        }

        foreach ($groups as $ids => $group) {
            array_unshift($output, $group);
            $ids = explode(',', $ids);
            foreach ($ids as $id)
                resolve($fwd, $id, $output);
        }
    }
    else {
        resolve($fwd, $fwd[$id][0], $output);
    }
}

$output = array();
foreach ($ends as $end)
    resolve($fwd, $end, $output);
print_r($output);

Выходы:

Array
(
  [0] => 3
  [1] => 4
  [2] => Array
      (
          [0] => 5
          [1] => 6
      )

  [3] => 7
  [4] => 8
)
...