За последние 24 часа нас посетили 18037 программистов и 1634 робота. Сейчас ищут 1893 программиста ...

вывести ближайшие значения из таблици

Тема в разделе "PHP и базы данных", создана пользователем ky3mu4u, 25 май 2012.

  1. ky3mu4u

    ky3mu4u Активный пользователь

    С нами с:
    16 ноя 2007
    Сообщения:
    111
    Симпатии:
    0
    Помогите, не могу найти решения как вывести ближайшую группу значений.
    К примеру содержание таблицы:
    id|day
    1|1
    2|8
    3|14
    4|21
    5|22
    6|26
    7|27
    8|28
    смысл вывести группу значений day 21,22,26,27,28 указав максимальный интервал day группировки т.е.к примеру интервал задаем 2 и он уже делит на 2 группы чисел 21, 22 и 26,27,28 потому что между 22 и 26 числом не 2 дня))
    или ставим интервал 4 и он выводи нам всю группу чисел 21,22,26,27,28.
    Думаю смысл понятен)) прошу помощи в решении данной ситуации)

    Добавлено спустя 6 минут 41 секунду:
    ой чуть не забыл day 1,8,14 тоже должны выводиться но каждое число это отдельная группа, поскольку у них нет ближайших по интервалу чисел.
    к примеру если мы укажем интервал 2 (|- разделитель):
    1 | 8 | 14 | 21,22 | 26,27,28 |
    вот что должно получиться в итоге))
     
  2. ky3mu4u

    ky3mu4u Активный пользователь

    С нами с:
    16 ноя 2007
    Сообщения:
    111
    Симпатии:
    0
    так не кто и не подскажет как это сделать?((((
     
  3. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Код (PHP):
    1. <pre>
    2. <?php
    3. $rows = array(
    4.     1 => 1,
    5.     2 => 8,
    6.     3 => 14,
    7.     4 => 21,
    8.     5 => 22,
    9.     6 => 26,
    10.     7 => 27,
    11.     8 => 28
    12. );
    13. $inGroup = 2;
    14. $groups = array();
    15. $groupNum = 0;
    16. $prevDay = 0;
    17. foreach($rows as $id => $day) {
    18.     if(($day - $prevDay) > $inGroup)
    19.         $groups[++$groupNum] = array($day);
    20.     else
    21.         $groups[$groupNum][] = $day;
    22.     $prevDay = $day;
    23. }
    24. print_r($groups);
    25. ?>
    26. </pre>
    Добавлено спустя 1 минуту 31 секунду:
    А как сделать одним MySQL - не исключаю, что это возможно, но это надо напрячься и подумать, что как-то неохота сейчас...
     
  4. ky3mu4u

    ky3mu4u Активный пользователь

    С нами с:
    16 ноя 2007
    Сообщения:
    111
    Симпатии:
    0
    5 сек, проверю! php тоже устроит, главное отобрать айдишники для вывода
     
  5. ky3mu4u

    ky3mu4u Активный пользователь

    С нами с:
    16 ноя 2007
    Сообщения:
    111
    Симпатии:
    0
    Получается))))
    немогу кей заменить на айдишник
    $rows = Array ( [491] => 21 [492] => 22 [493] => 23 [494] => 24 )
    а в итоге выводит:
    Array ( [1] => Array ( [0] => 21 [1] => 22 [2] => 23 [3] => 24 ) )
    без оригинальных айди, которые мне нужно выводить))
    как их там прописать?
     
  6. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Код (PHP):
    1. <pre>
    2. <?php
    3. $rows = array(
    4.     1 => 1,
    5.     2 => 8,
    6.     3 => 14,
    7.     4 => 21,
    8.     5 => 22,
    9.     6 => 26,
    10.     7 => 27,
    11.     8 => 28
    12. );
    13. $inGroup = 2;
    14. $groups = array();
    15. $groupNum = 0;
    16. $prevDay = 0;
    17. foreach($rows as $id => $day) {
    18.     if(($day - $prevDay) > $inGroup)
    19.         $groups[++$groupNum] = array($id => $day);
    20.     else
    21.         $groups[$groupNum][$id] = $day;
    22.     $prevDay = $day;
    23. }
    24. print_r($groups);
    25. ?>
    26. </pre>
    Добавлено спустя 3 минуты 9 секунд:
    Если ты про то, как выбрать из базы, чтобы ID использовались в качестве ключей массива - то, например, так:
    Код (PHP):
    1. $sql = "SELECT `id`, `day` FROM `table` ORDER BY `day`";
    2. $res = mysql_query($sql, $db);
    3. $rows = array();
    4. if(mysql_num_rows($res) > 0) {
    5.     while($row = mysql_fetch_row($res))
    6.         $rows[$row[0]] = $row[1];
    7. } 
     
  7. ky3mu4u

    ky3mu4u Активный пользователь

    С нами с:
    16 ноя 2007
    Сообщения:
    111
    Симпатии:
    0
    не, они у меня уже выводятся как ключи:
    я их так соединил:
    while ($row2 = mysql_fetch_assoc($result2)) {
    $iddd[] = $row2['event_id'];
    $ro[] = $row2['event_day'];
    }
    print_r($rows = array_combine($iddd, $ro));
    принт р выдает это:
    Array ( [491] => 21 [492] => 22 [493] => 23 [494] => 24 )
    далее идет код:
    $inGroup = 2;
    $groups = array();
    $groupNum = 0;
    $prevDay = 0;
    foreach($rows as $id => $day) {
    if(($day - $prevDay) > $inGroup)
    $groups[++$groupNum] = array($id => $day);
    else
    $groups[$groupNum][$id] = $day;
    $prevDay = $day;
    }
    print_r($groups);
    прнт р выдает следующее:
    Array ( [1] => Array ( [0] => 21 [1] => 22 [2] => 23 [3] => 24 ) )

    тоесть он ключи тупо не подставил, немогу найти куда их там впихнуть))
     
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    По идее должны были сохраниться ключи... Точно обновил скрипт на сервере?
    Просто вот например такой код:
    Код (PHP):
    1. <pre>
    2. <?php
    3. $rows = array(
    4.     3 => 1,
    5.     7 => 8,
    6.     15 => 14,
    7.     21 => 21,
    8.     82 => 22,
    9.     35 => 26,
    10.     11 => 27,
    11.     92 => 28
    12. );
    13. $inGroup = 2;
    14. $groups = array();
    15. $groupNum = 0;
    16. $prevDay = 0;
    17. foreach($rows as $id => $day) {
    18.     if(($day - $prevDay) > $inGroup)
    19.         $groups[++$groupNum] = array($id => $day);
    20.     else
    21.         $groups[$groupNum][$id] = $day;
    22.     $prevDay = $day;
    23. }
    24. print_r($groups);
    25. ?>
    26. </pre>
    выдаёт мне такой результат:
    Код (Text):
    1. Array
    2. (
    3.     [0] => Array
    4.         (
    5.             [3] => 1
    6.         )
    7.  
    8.     [1] => Array
    9.         (
    10.             [7] => 8
    11.         )
    12.  
    13.     [2] => Array
    14.         (
    15.             [15] => 14
    16.         )
    17.  
    18.     [3] => Array
    19.         (
    20.             [21] => 21
    21.             [82] => 22
    22.         )
    23.  
    24.     [4] => Array
    25.         (
    26.             [35] => 26
    27.             [11] => 27
    28.             [92] => 28
    29.         )
    30.  
    31. )
     
  9. ky3mu4u

    ky3mu4u Активный пользователь

    С нами с:
    16 ноя 2007
    Сообщения:
    111
    Симпатии:
    0
    скопировал твой последний код все заработало))) видимо я мог я ге то затереть когда пытался прописать туда id вместо кея)) спасибо огромное))