[PHP] перебор 2-х массивов одновременно

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Гость
проходил мимо

[PHP] перебор 2-х массивов одновременно

Непрочитанное сообщение Гость » 2010-04-21 12:08:27

Связка php+mysql.
Организуются 2 запроса:

Код: Выделить всё

$select31 = "select * from Ports where Ports.Equip_id = '$id'";
$res31 = mysql_query($select31);

$select32 = "select * from Channel_new where Point='$channel_id'";
$res32 = mysql_query($select32);
$row32 = mysql_fetch_assoc($res32);

эти запросы выдают одну и более строк.
Надо нарисовать таблицу, в которой перебираются значения нужных столбцов из этих запросов.
Если делаю

Код: Выделить всё

while ($row31 = mysql_fetch_assoc($res31)) {//0
while ($row32=mysql_fetch_assoc($res32))
...строчки таблицы
, то будет перебираться только внутренний массив $row32
если меняю while'ы местами, то будет перебор массива наоборот.
Как организовать все-таки перебор обоих массивов одновременно?
Последний раз редактировалось ProFTP 2010-04-29 21:09:11, всего редактировалось 2 раза.
Причина: [code][/code]

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: перебор 2-х массивов одновременно

Непрочитанное сообщение ProFTP » 2010-04-21 17:19:06

тут массив-хэшей если я правильно понял?
на perl это просто:

Код: Выделить всё

foreach (0..10) {
if $array1->[$_]->{tt};
if $array2->[$_]->{tt};
}
на php точно так же :)

почему бы не сделать, не поставить условия в SQL запросе? зачем это перебирать в скрипте? ну и еще вариант сделать временную таблицу...

===
я вот не понял эти массивы одинаковые?

можно попробовать так:

Код: Выделить всё

foreach ($res31 as $v) {
echo 'g='.$res31[$v]['bla'].'       '.$res32[$v]['bla']  ;
} 
можно еще так пройтись вдоль двух массивов, и посмотерть там посленюю структуру ['bla'] :

Код: Выделить всё

$max_a = ; // max item $res31 && $res32
for ($i=0; $i<=$max_a; $i++)
   { 
echo 'g='.$res31[$i]['bla'].'       '.$res32[$i]['bla']  ;
} 
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение


Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: перебор 2-х массивов одновременно

Непрочитанное сообщение ProFTP » 2010-04-21 17:23:45

перебирать структуры в скрипте на php, если можно в mysql - это не благородное дело, это zg, тоже, говорил

вариант на php я написал, только если он подойдет... мне показалось что очень странный вариант решения такого перебора
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Гость
проходил мимо

Re: перебор 2-х массивов одновременно

Непрочитанное сообщение Гость » 2010-04-21 20:11:18

просто в цикле надо вывести последовательно номера портов оборудования и клиенты, подключенные к каждому из портов.
Каждый из запросов будет возвращать одну строку для таблицы. Чтобы вывести все строки - вот и организую цикл while.
Но получается, что внешний while не срабатывает (т.е. значения не перебираются, а выводится только первое совпадение)

Аватара пользователя
BlackCat
прапорщик
Сообщения: 469
Зарегистрирован: 2007-10-16 22:40:42

Re: перебор 2-х массивов одновременно

Непрочитанное сообщение BlackCat » 2010-04-29 8:16:04

Значение возвращаемое mysql_query() - это не массив, это "ресурс". Для извлечения строки как раз и используется функция mysql_fetch_assoc(). Отличае в том, что по массиву вы можете пройти несколько раз, а вот строку из ресурса второй раз получить нельзя. Ваш второй вложенный цикл при втором и последующих выполнениях как раз пытается извлечь строку, которой уже нет.
Если вам требуется получить именно массив и потом с ним работать, попробуйте сначала извлечь все строки из результата:

Код: Выделить всё

/* Perform queries */
$res_1 = mysql_query($query_1);
$res_2 = mysql_query($query_2);

/* Construct arrays */
$arr_1 = array();
while($row = mysql_fetch_assoc($res_1))
  $arr_1[] = $row;

$arr_2 = array();
while($row = mysql_fetch_assoc($res_2))
  $arr_2[] = $row;

/* Process arrays */
foreach($arr_1 as $item_1) {
  foreach($arr_2 as $item_2) {
/* Your proccessing code here ... */
  }
}
=====
Ещё раз повторю слова тов. ProFTP, которые присутствуют в любой книге о php+mySQL: не надо в скрипте делать то, что может сделать СУБД - это только снижает производительность. Подумайте о том, как сделать один запрос и потом вывести всё одним циклом - это действительно возможно в 99% случаев.
Последний раз редактировалось zg 2010-04-29 19:41:12, всего редактировалось 1 раз.
Причина: queries