Intereting Posts
Как получить токен доступа без вмешательства пользователя для известной учетной записи с помощью API Google Youtube v3? order by rand () получает проблемы для больших сообщений Сбалансированный перенос слов (минимальная рвность) в PHP PHP, создающий многомерный массив потоков сообщений из многомерного массива (IMAP) Столкновения с другими методами Выполнение скрипта SASS с PHP и получение вывода Почему этот код не просто печатает буквы от A до Z? Объединяйте массивы, чтобы они содержали только повторяющиеся значения : не удалось открыть поток: HTTP-запрос не удался! HTTP / 1.0 400 Bad Request Есть ли способ определить, достигает ли адрес электронной почты своего адресата? Переопределить метод родителя для родительского контекста в PHP Получить год с указанной даты php Переадресация звонков Twilio jquery post данные в php-скрипт и немедленно отображать его в том же файле сценария php Переместить элемент в ассоциативный массив в PHP

Используйте mysql_fetch_array () вместо foreach () вместо while ()

Я хочу знать, как мы преобразуем следующий код для работы с foreach

$query_select = "SELECT * FROM shouts ORDER BY id DESC LIMIT 8;"; $result_select = mysql_query($query_select) or die(mysql_error()); while($row = mysql_fetch_array($result_select)) { $ename = stripslashes($row['name']); $eemail = stripcslashes($row['email']); $epost = stripslashes($row['post']); $eid = $row['id']; $grav_url = "http://www.gravatar.com/avatar.php?gravatar_id=".md5(strtolower($eemail))."&size=70"; echo ('<img src = "' . $grav_url . '" alt="Gravatar">'.'<br/>'); echo $eid . '<br/>'; echo $ename . '<br/>'; echo $eemail . '<br/>'; echo $epost . '<br/><br/><br/><br/>'; 

Вы можете сделать следующее:

 $query_select = "SELECT * FROM shouts ORDER BY id DESC LIMIT 8;"; $result_select = mysql_query($query_select) or die(mysql_error()); $rows = array(); while($row = mysql_fetch_array($result_select)) $rows[] = $row; foreach($rows as $row){ $ename = stripslashes($row['name']); $eemail = stripcslashes($row['email']); $epost = stripslashes($row['post']); $eid = $row['id']; $grav_url = "http://www.gravatar.com/avatar.php?gravatar_id=".md5(strtolower($eemail))."&size=70"; echo ('<img src = "' . $grav_url . '" alt="Gravatar">'.'<br/>'); echo $eid . '<br/>'; echo $ename . '<br/>'; echo $eemail . '<br/>'; echo $epost . '<br/><br/><br/><br/>'; } 

Как вы можете видеть, все равно нужен цикл, чтобы получить данные из mysql_fetch_array

Невозможно преобразовать его в foreach, потому что mysql_fetch_array() просто извлекает следующий результат из $result_select . Если вы действительно хотели, чтобы вы делали выбор, вы могли бы сначала вывести все результаты в массив, сделав что-то вроде следующего:

 $result_list = array(); while($row = mysql_fetch_array($result_select)) { result_list[] = $row; } foreach($result_list as $row) { ... } 

Но я не вижу никаких оснований для этого – и вам все равно придется использовать цикл while, что неизбежно из-за того, как работает mysql_fetch_array() . Почему так важно использовать foreach ()?

EDIT: Если это только для учебных целей: вы не можете преобразовать это в foreach . У вас должен быть уже существующий массив для использования foreach() вместо while() , а mysql_fetch_array() извлекает один результат для каждого звонка – для перебора не существует уже существующего массива foreach() .

Для использования foreach потребуется, чтобы у вас был массив, содержащий каждую строку из результата запроса. Некоторые библиотеки БД для PHP предоставляют функцию fetch_all которая предоставляет соответствующий массив, но я не мог найти его для mysql (однако расширение mysqli делает). Вы, конечно, могли бы написать свой собственный, так

 function mysql_fetch_all($result) { $rows = array(); while ($row = mysql_fetch_array($result)) { $rows[] = $row; } return $rows; } 

Однако я должен повторить «почему?». Используя эту функцию, вы создаете две петли вместо одной, и чтобы весь набор результатов был загружен в память. Для достаточно больших наборов результатов это может стать серьезным перетаскиванием. И для чего?

 foreach (mysql_fetch_all($result) as $row) 

против

 while ($row = mysql_fetch_array($result)) 

while и столь же кратким, а ИМО более читабельным.

EDIT Есть еще один вариант, но это довольно абсурдно. Вы можете использовать интерфейс итератора

 class MysqlResult implements Iterator { private $rownum = 0; private $numrows = 0; private $result; public function __construct($result) { $this->result = $result; $this->numrows = mysql_num_rows($result); } public function rewind() { $this->rownum = 0; } public function current() { mysql_data_seek($this->result, $this->rownum); return mysql_fetch_array($this->result); } public function key() { return $this->rownum; } public function next() { $this->rownum++; } public function valid() { return $this->rownum < $this->numrows ? true : false; } } $rows = new MysqlResult(mysql_query($query_select)); foreach ($rows as $row) { //code... } 

В этом случае экземпляр MysqlResult извлекает строки только по запросу, точно так же, как с помощью while , но обертывает его в приятный пакет foreach. В то время как вы сохранили цикл, вы добавили накладные расходы на создание экземпляров класса и нагрузку на вызовы функций, не говоря уже о большой сложности кода.

Но вы спросили, можно ли это сделать, не используя while (или, for я полагаю). Ну, это можно сделать, просто так. Должно ли это быть сделано, зависит от вас.

наиболее очевидный способ сделать foreach возможностью включает в себя материализацию всего набора результатов в массиве, который рано или поздно, вероятно, убьет вас по памяти. вам нужно обратиться к итераторам, чтобы избежать этой проблемы. см. http://www.php.net/~helly/php/ext/spl/