структура результирующего набора для вложенных циклов while внутри цикла foreach

Я использую Sphinx Search для поиска элементов на моем веб-сайте. Я использую foreach для поиска индекса, откуда исходит поиск? Цикл Foreach будет перебирать все элементы, соответствующие поисковому запросу, и будет определять индекс.

Все элементы в базе данных имеют user_id, который ссылается на пользователя из пользовательской таблицы. Итак, я хочу вывести несколько элементов (выполнить поиск) и соединить их вместе с этим пользователем. Если выполнить поиск «Book», затем вывести «Вот так»

Alex       //Book1,Book2,Book3 all of them has user_id of 2 which refers to Alex

Book1
Book2
Book3

Jordan     //Book11,Book12,Book18 all of them has user_id of 5 which refers to Joradn

Book11
Book12
Book18

and so on.

Вот код для этого

foreach ( $res["matches"] as $doc => $docinfo ) {
switch($docinfo['attrs']['table_id']) {
case 1:                         //if search come from index 1

$res_db = mysqli_query($connect3,'select id_2, image, user_id, title, detail from lunch_menu where id_2 = (('.$doc.'-300000))');
if ($res_db === false) {
echo "Error in mysql query #" . mysqli_errno($connect) . ' - ' . mysqli_error($connect);
} else {
$row = mysqli_fetch_assoc($res_db);
$connect4=mysqli_connect('localhost', 'root', '','user');
$sql2="SELECT * FROM `user`.`user_det` WHERE id='".$row['user_id']."' GROUP BY id ORDER
BY id DESC";
$query2=mysqli_query($connect4,$sql2);
while($row2 = mysqli_fetch_assoc($query2)){    //line X
$userx=$row2['id'];
$image=$row2['img'];
$busi_title=$row2['busi_title'];

$page_owner.="<img src='../../account/$userx/$image' width='140'
height='140'><b>$busi_title</b><hr>";

$res_db2 = mysqli_query($connect3,'select id_2, image, user_id, title, detail from
lunch_menu where id_2 in ((' . $doc . '-300000)) order by field(id_2,('.$doc.'-300000))');
$alu="";
while($row3 = mysqli_fetch_assoc($res_db2)){
$alu.=

'<img src="../../'.$row3['user_id'].'/lunch/'.$row3['image'].'" width="100" height="100">'
. '<a href="../../'.$row3['user_id'].'/menu_item2.php">' . $row3['title'] . '<a>'

. '<br/> '.$row3['detail'].'<br><br><br><br>' ;
}
$all.="<div id='' style='border:2px solid black;'>".$page_owner.".".$alu."</div>";
}
}

Но приведенный выше код дает мне такой результат

Alex
Book1

Alex
Book2

Alex
Book3

Jordan
Book11

Jordan
Book12

Jordan
Book18

and so on.

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

Пожалуйста, помогите, если сможете. Это было бы действительно здорово.

заранее спасибо

Спасибо Райан за ваш ответ. Мы почти на месте

Еще 1 исправление, тогда мы закончили. Теперь я получаю

Problem
Result is almost the way,I was looking for except for the first one.This is what I'm getting

Alex
Book1

Jordan
Book11
Book12
Book18

Alex
Book2
Book3

Если я могу сделать временный order by user_id прежде чем эхо $allэта ошибка может быть исправлена.

Так как $all печать user И его corresponding item как это отсортировано в базе данных

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

Я разобрался со второй частью проблемы. Чтобы добиться желаемого результата, мне нужно было это сделать.

$cl->SetSortMode(SPH_SORT_EXTENDED, '@relevance DESC,user_id ASC');

Эта строка кода сначала выводит наиболее релевантные результаты поиска и классифицирует по user_id По возрастанию.

Special Thanks to Ryan

0

Решение

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

Во-первых, если проблема заключается во внутреннем цикле, это простое решение. Показывать ‘user_id’ только в первом цикле.

                $alu="";
$firstLoop = true;
while($row3 = mysqli_fetch_assoc($res_db2)){
if($firstLoop){
$alu.= '<img src="../../'.$row3['user_id'].'/lunch/'.$row3['image'].'" width="100" height="100">'
$firstLoop = false;
}
$alu.= '<a href="../../'.$row3['user_id'].'/menu_item2.php">' .  row3['title'] . '<a>'

. '<br/> '.$row3['detail'].'<br><br><br><br>' ;
}

В качестве альтернативы, это может происходить в внешней петле, как предложил Шон. В этом случае мы можем просто следить за предыдущим пользователем, чтобы определить, следует ли установить $ userx и использовать $ page_owner.

     $prevUsr = '';
foreach ( $res["matches"] as $doc => $docinfo ) {
switch($docinfo['attrs']['table_id']) {
case 1:                         //if search come from index 1

$res_db = mysqli_query($connect3,'select id_2, image, user_id, title, detail from lunch_menu where id_2 = (('.$doc.'-300000))');
if ($res_db === false) {
echo "Error in mysql query #" . mysqli_errno($connect) . ' - ' . mysqli_error($connect);
} else {
$row = mysqli_fetch_assoc($res_db);
$connect4=mysqli_connect('localhost', 'root', '','user');
$sql2="SELECT * FROM `user`.`user_det` WHERE id='".$row['user_id']."' GROUP BY id ORDER
BY id DESC";
$query2=mysqli_query($connect4,$sql2);
while($row2 = mysqli_fetch_assoc($query2)){
$userx=$row2['id'];
$image=$row2['img'];
$busi_title=$row2['busi_title'];

$page_owner.="";

// only set the page owner if the user id is different
if($prevUsr != $userx){
$page_owner.="<img src='../../account/$userx/$image' width='140'
height='140'><b>$busi_title</b><hr>";

$prevUsr = $userx;
}

$res_db2 = mysqli_query($connect3,'select id_2, image, user_id, title, detail from
lunch_menu where id_2 in ((' . $doc . '-300000)) order by field(id_2,('.$doc.'-300000))');
$alu="";
while($row3 = mysqli_fetch_assoc($res_db2)){
$alu.=

'<img src="../../'.$row3['user_id'].'/lunch/'.$row3['image'].'" width="100" height="100">'
. '<a href="../../'.$row3['user_id'].'/menu_item2.php">' . $row3['title'] . '<a>'

. '<br/> '.$row3['detail'].'<br><br><br><br>' ;
}
$all="<div id='' style='border:2px solid black;'>".$page_owner.".".$alu."</div>";
}
}

Я надеюсь, что один из них поможет вам.

Удачного кодирования.
Райан

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]