Как поочерёдно вывести элементы двумерного массива

Squall

Новичок
Как поочерёдно вывести элементы двумерного массива

Как поочерёдно вывести элементы двумерного массива. Известно, что у массива всегда 2 столбца, а вот количество строк меняется в зависимости от результата запроса
 

zerkms

TDD infected
Команда форума
Squall
а ты точно смотрел мануал на предмет for или foreach?
 

Фанат

oncle terrible
Команда форума
Squall
оно тебе не нужно.
познай тайную силу [m]foreach[/m]
 

Squall

Новичок
Попробовал через sizeof. Разбил двумерный массив на два простых. А теперь проблема в том, что кроме первого елемента ничего не выводится.
 

0xHH

Новичок
Squall
загрузил :)

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

Фанат

oncle terrible
Команда форума
мля...
PHP:
foreach ($mainarray as $key1 => $array) {
  echo $key1."<br>";
  foreach ($array as $key2 => $item) {
    echo "- ".$key2.":".$item."<br>";
  }
}
 

Squall

Новичок
Вобщем попробовал я foreach тоже самое. Код примерно такой

$query="SELECT name FROM chat_users WHERE online='online' ";
$users_array=mysql_fetch_array(dbsqlquery($query));
$col1=$users_array;
$co=sizeof($col1);
if ($co>0) {
foreach ($col1 as $value) {
$query="SELECT status FROM chat_users WHERE name='$value'";
$st=mysql_fetch_array(dbsqlquery($query));
?><font color=<?php
if ($st[0]=="admin"){ echo $admin_color;}
if ($st[0]=="guard"){ echo $guard_color;}
if ($st[0]=="guest"){ echo $guest_color;}
?>><?php echo $value ?></font> <?php
}
}

В данном случае в одной строке выводится два раза первый элемент. И всё!
 

vitus

мимо проходил
Squall
- странные действия у тебя, внимательно прочти - что делает mysql_fetch_array - явно не то, что ты думаешь
 

ThomLee

Новичок
Автор оригинала: vitus
Squall
- странные действия у тебя, внимательно прочти - что делает mysql_fetch_array - явно не то, что ты думаешь
Не явно. Посмотри сам внимательно: dbsqlquery() присутствует, могу предположить, что эта функция возвращает resource_id.

-~{}~ 17.07.06 17:15:

Автор оригинала: Squall
Вобщем попробовал я foreach тоже самое. Код примерно такой

$query="SELECT name FROM chat_users WHERE online='online' ";
$users_array=mysql_fetch_array(dbsqlquery($query));
$col1=$users_array;
$co=sizeof($col1);
if ($co>0) {
foreach ($col1 as $value) {
$query="SELECT status FROM chat_users WHERE name='$value'";
$st=mysql_fetch_array(dbsqlquery($query));
?><font color=<?php
if ($st[0]=="admin"){ echo $admin_color;}
if ($st[0]=="guard"){ echo $guard_color;}
if ($st[0]=="guest"){ echo $guest_color;}
?>><?php echo $value ?></font> <?php
}
}

В данном случае в одной строке выводится два раза первый элемент. И всё!
PHP:
while($st=  $st=mysql_fetch_array(dbsqlquery($query))){
        if ($st[0]=="admin"){ echo $admin_color;}
        if ($st[0]=="guard"){ echo $guard_color;}
        if ($st[0]=="guest"){ echo $guest_color;}
}
Это тебе поможет. Только коряво сделано. Тебе 2 цикла тут нафиг не нужны. Это всё сделать можно одним запросом.
SELECT name, status FROM chat_users WHERE name='online'
Второе, поскольку тебе известны названия полей, то логичнее добавить в mysql_fetch_array() вторым параметром константу MYSQL_ASSOC или воспользоваться функцией mysql_fetch_assoc()

P.S.
Толи из-за того, что код не полный, толи невнимательность твоя, но огрехи через строчку.

-~{}~ 17.07.06 17:16:

и сначала лучше сформировать еременные строчек, а потом уже выводить их.
 

Squall

Новичок
Всё ! Получилось! Код такой:
$query="SELECT name,status FROM chat_users WHERE online='online' ";
$users_array=dbsqlquery($query);

while($row = mysql_fetch_array($users_array)) {
?><font color=<?php
if ($row["status"]=="admin"){ echo $admin_color;}
if ($row["status"]=="guard"){ echo $guard_color;}
if ($row["status"]=="guest"){ echo $guest_color;}
?>><?php echo $row["name"]; ?></font> <?php
}

После внимательного прочтения мануалов выяснилось, что mysql_fetch_array() возвращает также индексы, как названия полей.
 

0xHH

Новичок
Имхо, эти if-ы я бы переделал в нечто разумное. Проводится сравнения с типами юзеров. Эти типы лучше внести в бд, чтобы при их изменении не пришлось менять эти if. Далее эти типы читаются с базы в массив {usertype, color}и проводить проверку одним if-ом через in_array. Значение цвета выдирать через usertype_color_array[$row["status"]]

-~{}~ 18.07.06 15:56:

PHP:
if (in_array($row["status"], $usertype_color_array))
{
       echo $usertype_color_array[$row["status"]]; 
}
else
{
       echo $row["name"];
}
 

ThomLee

Новичок
Автор оригинала: Squall
После внимательного прочтения мануалов выяснилось, что mysql_fetch_array() возвращает также индексы, как названия полей.
Гхм... разумеется, только, как я говорил выше, используй константу, приведенную выше, чтобы размер возвращаемого массива был вдвое меньше, тебе ведь не нужны численные индексы.

Далее, я бы пошел по другому пути
1.а) вместо трех строковых переменных, я бы создал один массив для цветов:
PHP:
$colors=array(
      "admin"=>"#FFFFFFF",
     "guest"=>"#FF0000",
     //и т.д.
);
1.б)соответственно в цикле бы использовал бы list() key()

2) Второй путь, использовал бы подчиненную таблицу для типов (удобно тем, что кол-во типов может быть больше и их легко добавлять)
а)соответсвенно в первой таблице, вместо varchar() для admin, guest и т.д. использовал бы integer(11), где значение поля является
0 - admin 1 - guest и т.д. Соответсвенно в подчиненной таблице занес:
1)Название типа пользователя
2)Права
3)Цветовую схему
4)Описание
5)..... и т.д.
Соответственно запрос бы выглядел так:

SELECT t1.name, t2.type, t2.color FROM chat_users AS t1 LEFT JOIN users_type AS t2 ON(t2.id=t1.gid) WHERE t1.status='online';
Примечание: status я бы сделал числовой энумератор, но это на вкус.

Т.е. одним запросом ты получаешь все нужные данные в один массив не делая лишних кривых if'ов и телодвижений.
ИМХО это более оправдано и дает возможность легко менять/добавлять условия, праметры и т.д. не влезая в код каждый раз.
 
Сверху