создание цикла, который иногда может быть непрерывным, а иногда нет

1

вы можете предложить мне заголовок после прочтения

Итак, у меня есть эта база данных

 name      id1    id2

 carl     1154    0
 mary     4592    0
 jake     5820    4592
 john     6495    0
 shannon  1047    6495
 kalsey   2281    5820
 scarlet  4419    2281

я собираюсь рассказать, что я хочу делать, как указано выше, так как мой английский не очень хорош. Пожалуйста, дайте мне уведомление, если вы не получите его.

  • Carl id2 = 0
  • mary'S id2 = 0
  • jake id2! = 0 → прямо там я хочу найти jake id2 внутри разделов id1. (гнездо id2 = 4592, и это mary id1). теперь я хочу снова получить mary id2, который равен 0, что означает, что я могу искать следующее имя (если mary id2 не будет равен 0, я хочу продолжить цикл)
  • john id2 = 0
  • shannon id2 = 6495 → 6495 - это john id1 и john id2 = 0 → loop заканчивается
  • kalsey id2 = 5820 -→ 5820 дает мне jake ---> jake id2 не равно 0 agian (его 4592) ---> продолжать цикл ---> 4592 дает мне mary ---> жениться id2 = 0 ---> концы циклы
  • алый id2 = 2281 → берет нас к kalsey -→ kalsey берет нас к jake → Джейк берет нас mary ---> концы цикла.

Как я напишу свою программу? Я попробовал что-то вроде этого.

//first while gets id2
while($row = mysqli_fetch_array($command)){
    while ($row[id2] != 0){
        //get id1 
        // find id2
     }
}

когда эта программа достигает джака, она повторяется до бесконечности --→ carl, mary, jake, mary, jake, mary, jake, mary, jake, mary, jake,.....

  • 0
    Я бы посоветовал изучить рекурсию, чтобы сделать то, что вы ищете.
  • 0
    @DerekBaxter рекурсия?
Показать ещё 5 комментариев
Теги:
loops
while-loop

2 ответа

0

У меня нет базы данных, поэтому я использую массив, вы просто копируете-вставляете и запускаете следующий код и даете мне знать, является ли это вашим ожидаемым результатом, он рекурсивный, поэтому его трудно объяснить, но я объясню это после проверки:

<?php
echo "Right sequence : " .
     "carl-mary-jake-mary-john-shannon-john-kalsey-jake-mary-scarlet-kalsey-jake-mary" .
     "<br/>" .
     "New sequence : ";
$database = Array( Array( "name" => "carl",    "id1"  => "1154", "id2"  => "0"    ),
                   Array( "name" => "mary",    "id1"  => "4592", "id2"  => "0"    ),
                   Array( "name" => "jake",    "id1"  => "5820", "id2"  => "4592" ),
                   Array( "name" => "john",    "id1"  => "6495", "id2"  => "0"    ),
                   Array( "name" => "shannon", "id1"  => "1047", "id2"  => "6495" ),
                   Array( "name" => "kalsey",  "id1"  => "2281", "id2"  => "5820" ),
                   Array( "name" => "scarlet", "id1"  => "4419", "id2"  => "2281" )
                 );

recursive( 0,TRUE ); // START PROCESS.

// $I    : POINTS TO EACH ELEMENT IN ARRAY.
// $NEXT : TRUE  = JUMP TO NEXT ELEMENT.
//         FALSE = DON'T JUMP TO NEXT ELEMENT.
function recursive ( $i,$next )  {
global $database;
if ( $i < count( $database ) ) // IF NOT BEYOND LIMITS...
   { echo $database[ $i ][ "name" ] . "-";
     if ( $database[ $i ][ "id2" ] != "0" ) // IF HAS LINKED ELEMENT...
        recursive( find_id2( $database[ $i ][ "id2" ] ),false ); // FALSE = DONT VISIT NEXT ELEMENT.
     if ( $next )
        recursive( ++$i,true ); // TRUE = VISIT NEXT ELEMENT.
   }
}

function find_id2 ( $id2 ) {
global $database;
for ( $i = 0; $i < count( $database ); $i++ )
  if ( $database[ $i ][ "id1" ] == $id2 )
     return $i;
return -1; // NOT FOUND.
}

?>

Параметр $next делает магию ("иногда может быть непрерывной, а иногда и нет"), благодаря которой мы решаем, нужно ли посещать следующий элемент или нет. Например, "carl" должен посещать следующий "mary" (TRUE), но "jake" перескакивает на "mary", который прыгает на "jake", благодаря $next мы знаем, что "mary" не должен прыгать на "jake" "(FALSE), или мы будем навечно зацикливаться.

  • 0
    я не знаю, как сказать ... это становится алым к Калси и останавливается. но это должно заставить Калси Джейка и Джейка Мэри. как будто он останавливается после двух, но это должно быть продолжено. кроме этого его хорошо
  • 0
    @ user3301042, исправлено, добавлена переменная $next с потоком управления, теперь она работает как шарм.
0

Это кажется забавным, как говорили другие в комментариях, вам нужна рекурсия, а не регулярный цикл.

<?php

function answer($data, $rowNumber) {
  // Echo so you can see the path
  echo $data[$rowNumber]['name'] . " --> ";

  // Get id2
  $id2 = $data[$rowNumber]['id2'];

  // If id2 is 0, then return success
  if ($id2 == 0) {
    echo "done\n";
    return true;
  }

  // If id2 isn't 0, look up the next name
  foreach ($data as $rowNum => $d) {
    if ($d['id1'] == $id2) {
      return answer($data, $rowNum);
    }
  }

  // No next name had id2=0, failure
  echo "failure, no path ends with id2=0\n";
  return false;
}

$array = array (
 array ('name' => 'mary',    'id1' => 4592, 'id2' => 0),
 array ('name' => 'jake',    'id1' => 5820, 'id2' => 4592),
 array ('name' => 'kalsey',  'id1' => 2281, 'id2' => 5820),
 array ('name' => 'scarlet', 'id1' => 4419, 'id2' => 2281),
);

answer($array, 3);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню