[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Группировка массива
web-monster
Есть такой массив:

Array
(
[
0] => Array
(
[
id] => 2969
[user] => dimon
[photo] => dimon_127944753376.jpg
[time] => 1279447533
)

[
1] => Array
(
[
id] => 2627
[user] => fanya
[photo] => fanya_1271624384.jpg
[time] => 1271624384
)

[
2] => Array
(
[
id] => 2631
[user] => fanya
[photo] => fanya_1271624597.jpg
[time] => 1271624598
)

[
3] => Array
(
[
id] => 2951
[user] => fanya
[photo] => fanya_1273611244.jpg
[time] => 1273611244
)

[
4] => Array
(
[
id] => 2952
[user] => dimon
[photo] => dimon_1273611517.jpg
[time] => 1273611518
)

)



Это идёт выборка новых фоток за день.
В итоге надо вывести в один блок фотки dimon две штуки и в другой блок фотки fanya три штуки ну и так далее.. Как с группировать?




Спустя 35 минут, 50 секунд (22.07.2010 - 10:15) tomash написал(а):
$array - наш массив

$foto = array();

foreach ($array as $var)
{
$foto[$var['user']][] = $var['foto'];// получаем массив с ключами имя пользователя и элементами - массивами фото
}

Спустя 10 минут, 41 секунда (22.07.2010 - 10:25) sergeiss написал(а):
Цитата (web-monster @ 22.07.2010 - 10:39)
Это идёт выборка новых фоток за день.

Выборка идет... Откуда? Из БД? Если "да, из БД", то тогда там и надо группировать.

А если не из БД, то откуда данные?

Спустя 15 минут (22.07.2010 - 10:40) Rand написал(а):
Не претендую на элегантность, но всё же:
$cnt=count($arr);
$users=array();
for($i=0;$i<$cnt;$i++) {
if(!in_array($arr[$i]['user'], $users)) {
$users[]=$arr[$i]['user'];
for($j=0;$j<$cnt;$j++) {
if($arr[$j]['user']==$arr[$i]['user']) echo $arr[$i]['user'].":".$arr[$j]['photo']."<br>";
}
}
}
А вообше, согласен с sergeiss.

Спустя 3 месяца, 12 дней, 13 часов, 24 минуты, 8 секунд (5.11.2010 - 01:04) only написал(а):
Похожая проблема, нужно чтобы была группировка (типа раскрывающегося списка +) если название Альбома уже существует в БД (поле Title в БД)


// ALBUMS (не отображается, если нет альбомов)

$nombre_albums = count($liste_albums);
if ($nombre_albums != 0) // если Есть альбомы
{
?>
</p>
<
p> </p>
<
h2>Альбомы</h2>
<
table width="90%" border="0" cellspacing="1" cellpadding="0" align="center" class="album">
<?php
for($d=0;$d<$nombre_albums;$d++)
{
$ft=explode("|",$liste_albums[$d]);

?>
<tr>
<
td class="bordure" width="60%"><a class="url" href="disk.php?ID=<?php echo $ft[1]; ?>"><?php echo $ft[2]; ?></a>
<?php
if($ft[6]!="") { echo " (".stripslashes($ft[6]).")" ;} // Комментарий
if($ft[5]!="") // двойной или тройной альбом?
{
if($ft[5]=="D") { echo " 2 CDs";}
if($ft[5]=="T") { echo " 3 CDs";}
}

?></td>

Спустя 26 минут, 24 секунды (5.11.2010 - 01:31) ИНСИ написал(а):
web-monster вот верный вариант, который написал: tomash
Цитата
$foto = array();

foreach ($array as $var)
{
$foto[$var['user']][] = $var['foto'];// получаем массив с ключами имя пользователя и элементами - массивами фото
}


sergeiss а что если из БД? Мне просто самому интересно как такое можно сделать.

Пример:
1. Таблица: photo: id, name, user.
2. В таблице photo 100 фоток, принадлежащие 5 пользователям, то есть получается у каждого пользователя по 20 фоток. Все фотки, в бд разбросаны.

Чтобы их все вывести, код знаю, будет так:
$rows = mysql_query("SELECT * FROM `photo` ORDER BY `id` DESC");
while($data = mysql_fetch_assoc($rows)) {
echo $data['photo'];
}


а как сделать, чтобы выводились по пользователям? Чтобы первые шли мои первые, потом еще чьи-то и т.д.......

Спустя 47 минут, 49 секунд (5.11.2010 - 02:19) sergeiss написал(а):
welbox2 - а ты про GROUP BY вообще слышал когда-нибудь? Если нет, то введи в строке поиска в любом поисковике "MYSQL SELECT GROUP BY" и получишь более чем подробный ответ на вопрос о группировке в БД. Я "копи-пейст" делать не хочу, своими словами об этом рассказывать тоже не хочу, чтобы не тратить зря время.

И еще... Не совсем в тему, но всё же. Вот что я никак всё не могу понять smile.gif Почему многие люди, говоря про работу с БД, приводят код выборки данных в ПХП?????????
Цитата (welbox2 @ 5.11.2010 - 02:31)
Чтобы их все вывести, код знаю, будет так:

Тут речь надо вести ТОЛЬКО о том, как правильно построить запрос, акцентировать внимение именно на этом. А если ты каждый раз (на форуме) пишешь код типа такого
Цитата (welbox2 @ 5.11.2010 - 02:31)
$rows = mysql_query("SELECT * FROM `photo` ORDER BY `id` DESC");
while($data = mysql_fetch_assoc($rows)) {
echo $data['photo'];
}

то внимание распыляется (вопрос относится не только к welbox2, но и ко всем форумчанам).

Спустя 9 минут, 8 секунд (5.11.2010 - 02:28) ИНСИ написал(а):
sergeiss по замечания согласен. Быть может не стоит приводить в примеры php код, если идет речь о запросах.

По поводу, MYSQL SELECT GROUP BY - мне было интересно всего лишь увидеть код запроса. Я не просил рассказать как и что работает, лишь примерный код, как ты это делаешь.

Спустя 7 часов, 22 минуты, 24 секунды (5.11.2010 - 09:50) sergeiss написал(а):
Цитата (welbox2 @ 5.11.2010 - 03:28)
Я не просил рассказать как и что работает, лишь примерный код, как ты это делаешь.

Я как ЭТО делаю? wink.gif Да очень просто smile.gif Так же, как и в хэлпе написано, как это делается в разных версиях SQL:
SELECT ....
FROM ....
GROUP BY ...
ORDER BY ....

То есть, точно "по букварю". Может еще быть специфика использования GROUP BY в зависимости от БД. Например, в MySQL и в PostgreSQL немного разные правила использования группировки.

А если тебе хочется пример... "Их у меня есть smile.gif". Один из многочисленных:
Свернутый текст
$sql="
select *
from
(
select orig.lac as lac, orig.cellid as cellid, dest.lac as targetlac, dest.cellid as targetcellid
from
(
select d_dir.cellref, d_dir.targetcellref, d_dir.omc as omc
from
(select * from cells_adj where date_='
$date' and omc=$omc) as d_dir
left outer join
(select * from cells_adj where date_='
$date' and omc=$omc) as b_dir
on d_dir.cellref=b_dir.targetcellref and d_dir.targetcellref=b_dir.cellref
where b_dir.cellref is null
) as one_way,
(select * from cells where date_='
$date' and omc=$omc) as orig,
(select * from cells where date_='
$date' and omc=$omc) as dest
where one_way.cellref=orig.cellref and one_way.omc=orig.omc and
one_way.targetcellref=dest.cellref and orig.omc=dest.omc and
orig.lac>=
$lac_begin and orig.lac<=$lac_end
) as one_ways
group by lac, cellid, targetlac, targetcellid
order by targetlac, targetcellid, lac, cellid
"
;

Ну и еще, для разнообразия с другими таблицами
Свернутый текст
/*Поиск направлений (linkset), где идет стабильное превышение нагрузки над порогом в 250 мЭрл */
$sql_get_ss7=
"select sel.*, f.f_count
from
(
select ne, lsname, avg( bh_ls_avg) as bh_ls_avg, max( bh_ls_max) as bh_ls_max, count(report_day) as err_count
from
(
select ne, lsname, avg(bh_max) as bh_ls_avg, max( bh_max) as bh_ls_max, report_day
from msc_ss7
where bh_max > 0 and
$where_day
group by ne, lsname, report_day
having avg(bh_max) > 250 and avg(bh_max)<1000
) sel

group by ne, lsname
) sel

right join

(
select ne, lsname, count(report_day) as f_count
from
(
select ne, lsname, report_day
from msc_ss7
where bh_max > 0 and
$where_day
group by ne, lsname, report_day
) sel

group by ne, lsname
) f

using( ne, lsname)
where err_count*1.0/f_count >= .5
order by ne, lsname"
;


Ну, еще один и хватит, наверное:

Свернутый текст
$sql="select date_, lac, cellid, trx_number,
tpr_timing_advance_1*100/sum_all as perc_1, tpr_timing_advance_2*100/sum_all as perc_2,
tpr_timing_advance_3*100/sum_all as perc_3, tpr_timing_advance_4*100/sum_all as perc_4,
tpr_timing_advance_5*100/sum_all as perc_5, tpr_timing_advance_6*100/sum_all as perc_6,
tpr_timing_advance_7*100/sum_all as perc_7, tpr_timing_advance_8*100/sum_all as perc_8,
tpr_timing_advance_9*100/sum_all as perc_9, tpr_timing_advance_10*100/sum_all as perc_10,
par_meas_stat_ta_0, par_meas_stat_ta_1, par_meas_stat_ta_2, par_meas_stat_ta_3,
par_meas_stat_ta_4, par_meas_stat_ta_5, par_meas_stat_ta_6, par_meas_stat_ta_7,
par_meas_stat_ta_8, par_meas_stat_ta_9, par_meas_stat_ta_10,

(tpr_timing_advance_1*(par_meas_stat_ta_1+par_meas_stat_ta_0)/2 +
tpr_timing_advance_2*(par_meas_stat_ta_2+par_meas_stat_ta_1)/2 +
tpr_timing_advance_3*(par_meas_stat_ta_3+par_meas_stat_ta_2)/2 +
tpr_timing_advance_4*(par_meas_stat_ta_4+par_meas_stat_ta_3)/2 +
tpr_timing_advance_5*(par_meas_stat_ta_5+par_meas_stat_ta_4)/2 +
tpr_timing_advance_6*(par_meas_stat_ta_6+par_meas_stat_ta_5)/2 +
tpr_timing_advance_7*(par_meas_stat_ta_7+par_meas_stat_ta_6)/2 +
tpr_timing_advance_8*(par_meas_stat_ta_8+par_meas_stat_ta_7)/2 +
tpr_timing_advance_9*(par_meas_stat_ta_9+par_meas_stat_ta_8)/2 +
tpr_timing_advance_10*(par_meas_stat_ta_10+par_meas_stat_ta_9)/2 )/sum_all as avg_ta

from
(
select *
from
(
select date_, lac, cellid, trx_number, sum_all,
tpr_timing_advance_1, tpr_timing_advance_2, tpr_timing_advance_3, tpr_timing_advance_4,
tpr_timing_advance_5, tpr_timing_advance_6, tpr_timing_advance_7, tpr_timing_advance_8,
tpr_timing_advance_9, tpr_timing_advance_10,
par_meas_stat_ta_0, par_meas_stat_ta_1, par_meas_stat_ta_2, par_meas_stat_ta_3,
par_meas_stat_ta_4, par_meas_stat_ta_5, par_meas_stat_ta_6, par_meas_stat_ta_7,
par_meas_stat_ta_8, par_meas_stat_ta_9, par_meas_stat_ta_10
from ta_distr
where
$where_date and lac>=$lac_begin and lac<=$lac_end

union

select date_, lac, cellid, 0 as trx_number, sum(sum_all), sum(tpr_timing_advance_1),
sum(tpr_timing_advance_2), sum(tpr_timing_advance_3), sum(tpr_timing_advance_4),
sum(tpr_timing_advance_5), sum(tpr_timing_advance_6), sum(tpr_timing_advance_7),
sum(tpr_timing_advance_8), sum(tpr_timing_advance_9), sum(tpr_timing_advance_10),
avg(par_meas_stat_ta_0), avg(par_meas_stat_ta_1), avg(par_meas_stat_ta_2),
avg(par_meas_stat_ta_3), avg(par_meas_stat_ta_4), avg(par_meas_stat_ta_5),
avg(par_meas_stat_ta_6), avg(par_meas_stat_ta_7), avg(par_meas_stat_ta_8),
avg(par_meas_stat_ta_9), avg(par_meas_stat_ta_10)
from ta_distr
where
$where_date and lac>=$lac_begin and lac<=$lac_end

group by date_, lac, cellid
) ta_summared
where sum_all>0 ) as ta_final
order by date_, lac, cellid, trx_number
"
;

Спустя 3 часа, 2 минуты, 5 секунд (5.11.2010 - 12:52) ИНСИ написал(а):
sergeiss воооот. воооот. теперь понял smile.gif спасибо! smile.gif

Я понял, я никогда не использовал GROUP BY.... блин, а все так просто smile.gif

Спустя 24 минуты, 59 секунд (5.11.2010 - 13:17) sergeiss написал(а):
Цитата (welbox2 @ 5.11.2010 - 13:52)
Я понял, я никогда не использовал GROUP BY.... блин, а все так просто

Да и вообще SQL - это просто biggrin.gif

А вот встречный вопрос: а что ты делал, если нужна была группировка? Не делал её вообще или внутри ПХП выполнял все операции?

Спустя 3 часа, 20 секунд (5.11.2010 - 16:18) ИНСИ написал(а):
sergeiss блин, мне стыдно, но делал через php. Загонял все по массивам и выводил sad.gif Точно также как сделал: tomash

Спустя 2 месяца, 26 дней, 3 часа, 45 минут, 59 секунд (31.01.2011 - 20:04) Гость_lokanaft написал(а):
И как при использовании "GROUP BY" получить список всех фото юзера, а не одной?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.