Intereting Posts
Как настроить PHP для отображения подробных ошибок вместо страницы с ошибкой 500? Symfony2 twig code не работает в шаблоне xml, поскольку он работает в html Что здесь означает этот оператор? Что использовать: REMOTE_ADDR или SERVER_ADDR Как извлечь определенные ключи и значения массива в другой массив? Как загружать файлы на YouTube с помощью возобновляемого API загрузки v3 Войти с помощью Facebook SDK PHP – Пользователь должен дважды войти в систему Nginx или PHP FPM игнорирует memory_limit в php.ini wordpress 3.8.1 категория страница 2 ошибка 404 не найден / пользовательский тип сообщения как обрабатывать символ горизонтальной эллипсис (три точки) в XML-выходе через PHP Запрос MySQL с использованием sprintf в PHP Как проверить подлинность с помощью Sentinel по имени пользователя? Тестирование вставки базы данных с помощью Symfony Как вы используете одновременно $ _GET и # привязку? Нужно ли иметь wsdl-файл для создания веб-службы в php?

MySQL ORDER BY и while loop

Я уже задал вопрос, относящийся к этой проблеме здесь

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

Код из RiggsFolly основан на $current_provider поэтому while-loop проверяет каждый раунд, если $current_provider изменилась. Все идет нормально. НО теперь мне нужно было добавить всеобъемлющую логику. Мне кажется, что я добавил переменную true/false которая просто проверяет, равна ли значение из выбранного объекта определенной строке. Это сравнение сосредоточено на конкретном элементе списка, а не на базовом $current_provider .

Таким образом, цель состоит в том, что $current_provider проверяет каждый выбранный объект на true/false и будет независим от $current_provider . На данный момент я пытаюсь продлить второй цикл, но просто хочу привести пример в надежде, что будет ясно, чего достичь:

 $service = $db->query("SELECT * FROM `system` ORDER BY provider, artist"); $provider = NULL; $close = false; while ($data = $service->fetch_object()) { $amount_1 = $data->digit_1; //db-structure: float $amount_2 = $data->digit_2; //db-structure: float if ($amount_1 == $amount_2) { $close = true; } if ( $current_provider != $data->provider ) { if ( $current_provider !== NULL ) { echo '</div>close container in case of current_provider is already set'; } echo '<div class="provider">open a new container in case of current_provider is not like data->provider or empty'; $current_provider = $data->provider; } echo 'some styling for each object'; if ($close === true ) { echo '<div class="specific">if the amount_1 is same like amount_2 for a single object add only for this object a certain div'; } else { echo '<div>show standard container even on specific object'; } echo '</div><!--close container provider-->'; } 

С уважением.

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

Перемещение

 $amount_1 = $data->digit_1; $amount_2 = $data->digit_2; 

от совершенно хороших свойств объекта до 2 скалярных переменных совершенно ненужно, зачем хранить все в два раза, в конечном итоге у вас не if ($data->digit_1 == $$data->digit_2) { памяти, но что более важно, если вы оставите их в объекте и протестируете их, используя if ($data->digit_1 == $$data->digit_2) { его никогда не путают, откуда if ($data->digit_1 == $$data->digit_2) { эти данные!

Кроме того, тестирование цифр в верхней части цикла только для установки более полной скалярной переменной, используемой позже в нижней части цикла, является пустой тратой времени. Эти свойства не меняются между верхней и нижней частью цикла, поэтому проверяйте фактический объект, где вы хотите принять решение, а затем вытащите необходимый HTML-код прямо там и потом. Еще одна потенциальная путаница предотвратила и от 8 до 16 байт памяти не пропала даром!

 $service = $db->query("SELECT * FROM `system` ORDER BY provider, artist"); $current_provider = NULL; while ($data = $service->fetch_object()) { if ( $current_provider != $data->provider ) { if ( $current_provider !== NULL ) { echo '</div>close container in case of current_provider is already set'; } echo '<div class="provider">open a new container in case of current_provider is not like data->provider or empty'; $current_provider = $data->provider; } echo 'some styling for each object'; // at this point we test the 2 digits and if equal // add an extra bit of HTML to the output if ($data->digit_1 == $data->digit_2) { echo '<div class="specific">if the amount_1 same like amount_2 for a single object add only for this object an certain div'; } else { echo '<div>show standard container even on specific object'; } echo '</div>; } 

Чтобы избежать игры с открытием и закрытием, лучше сохранить их в массиве и в конце вывести их.

Посмотрите на мой пример, это просто:

 $service = $db->query("SELECT * FROM `system` ORDER BY provider, artist"); $provider = NULL; $lines = array(); while ($data = $service->fetch_object()) { $close = false; if ($something === $another) { $close = true; } if ( $provider != $data->provider ) { $lines[] = '<div class="provider">'.$data->provider.'</div>'; $provider = $data->provider; } if ($close === true ) { $lines[] = '<div class="specific">add container for just a specific object when close === true within the while loop</div>'; } else { $lines[] = '<div>show standard container on specific object</div>'; } } foreach($lines AS $line) { echo $line; }