вы можете предложить мне заголовок после прочтения
Итак, у меня есть эта база данных
name id1 id2
carl 1154 0
mary 4592 0
jake 5820 4592
john 6495 0
shannon 1047 6495
kalsey 2281 5820
scarlet 4419 2281
я собираюсь рассказать, что я хочу делать, как указано выше, так как мой английский не очень хорош. Пожалуйста, дайте мне уведомление, если вы не получите его.
Как я напишу свою программу? Я попробовал что-то вроде этого.
//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,.....
У меня нет базы данных, поэтому я использую массив, вы просто копируете-вставляете и запускаете следующий код и даете мне знать, является ли это вашим ожидаемым результатом, он рекурсивный, поэтому его трудно объяснить, но я объясню это после проверки:
<?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), или мы будем навечно зацикливаться.
$next
с потоком управления, теперь она работает как шарм.
Это кажется забавным, как говорили другие в комментариях, вам нужна рекурсия, а не регулярный цикл.
<?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);