Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Группировка близких чисел в промежуток
 
 автор: FaStY   (22.08.2009 в 00:21)   письмо автору
 
 

подскажите, выбираю из базы числа, например выбрали числа:
1, 4, 5, 6, 8, 10, 11, 15
Подскажите как сделать так, что бы я смог их вывести пользователю в виде промежутков, т.е. так:
1, 4-6 , 8 , 10-11, 15
Заранее спасибо.

  Ответить  
 
 автор: Akdmeh   (22.08.2009 в 00:28)   письмо автору
 
   для: FaStY   (22.08.2009 в 00:21)
 

Парсить строку, а поможет вам оператор(или как это называется) WHERE `id` BETWEEN 4 AND 7 к примеру

  Ответить  
 
 автор: FaStY   (22.08.2009 в 00:31)   письмо автору
 
   для: Akdmeh   (22.08.2009 в 00:28)
 

у меня массив с этими числами, с базой это не совсем то - сервер загнется)

  Ответить  
 
 автор: Valick   (22.08.2009 в 00:53)   письмо автору
 
   для: FaStY   (22.08.2009 в 00:31)
 

а почему не 1-4, 6-8 и тд?

  Ответить  
 
 автор: Drago   (22.08.2009 в 01:24)   письмо автору
 
   для: Valick   (22.08.2009 в 00:53)
 

Вероятно, потому что отсутствуют 2, 3 и 7.

  Ответить  
 
 автор: Valick   (22.08.2009 в 01:31)   письмо автору
 
   для: Drago   (22.08.2009 в 01:24)
 

5 тоже отсутствует
4-6 и 6-8 чем отличаются?

  Ответить  
 
 автор: neadekvat   (22.08.2009 в 01:47)   письмо автору
 
   для: Valick   (22.08.2009 в 01:31)
 

А где вы такие числа в примере увидели?
По-моему, человек вполне доходчего на примере показал, что ему нужно.
Соседне числа максимально группировать.
1, 4, 5, 6, 8, 10, 11, 15
1 стоит на отшиби, т.к. 2х нет.
4, 5, 6 - стоят рядом в бесконечной натуральных чисел, значит объединяем
И тд
Вам такие сокращения никогда не встречались?

А вот по реализации..таких функций готовых я не встречал, но как-то даже логику не могу предложить..

  Ответить  
 
 автор: Valick   (22.08.2009 в 02:27)   письмо автору
 
   для: neadekvat   (22.08.2009 в 01:47)
 

да, я ошибся
тогда всё гораздо проще

  Ответить  
 
 автор: heed   (22.08.2009 в 04:07)   письмо автору
 
   для: Valick   (22.08.2009 в 02:27)
 

примерно так можно сделать, если из массива , и вывести нужно
, только используя each() и current() сделал
с for скобок слишком много бывает ,)
<?php
$array 
= array(1,3,6,7,8,10,14,15,33,34);
$tmp 4;

while( list(,
$x) = each($array)) {
 
$y current($array);
###############################    
if(!($tmp 3)) {
 echo (
$tmp)? $x ', '$x;
    
$tmp = ($y == $x+1)? 10;
}
else { 
#########################
 
if ($y == $x+1$tmp 2;
 else {
    echo (
$tmp == 1)? ', '$x'-'$x;
    
$tmp 0;
 }
}
###############################
}
?>

  Ответить  
 
 автор: FaStY   (22.08.2009 в 04:41)   письмо автору
 
   для: heed   (22.08.2009 в 04:07)
 

спасибо, все работает. сижу ща разбираюсь в коде, хочу добавить, что бы 1,2 выводило 1-2

  Ответить  
 
 автор: heed   (22.08.2009 в 05:30)   письмо автору
 
   для: FaStY   (22.08.2009 в 04:41)
 

это как-то нелогично
1-2 это всего два числа 1 и 2

<?php
$array 
= array(1,3,6,7,8,10,14,15,33,34,44);
$tmp 0;

while( list(
$k,$x) = each($array)) {
 
$y current($array);
###############################    
if(!$tmp) {
 echo (
$k)? ', '$x $x;
 if (
$y == $x+1$tmp 1;
}
else { 
#######################
 
if ($y == $x+1) continue;
 echo  
'-'$x;
 
$tmp 0;
}
###############################
}
?>
здесь добавил $k, и первый ключ массива теперь обязательно должен быть 0

  Ответить  
 
 автор: FaStY   (22.08.2009 в 15:45)   письмо автору
 
   для: heed   (22.08.2009 в 05:30)
 

блин, чет у меня не получается, не мог бы ты мне помочь. Смотри, у меня масив приходит в таком виде:
т.е. я его форимрую while($row - mysql_fetch_array($result)) в такой вот вид, а потом опять прохожусь по нему тем скриптиком, что ты написал.
<?php
$bets
[100] = array('price' => 100'time' => 12);
$bets[110] = array('price' => 110'time' => 13);
$bets[111] = array('price' => 111'time' => 14);
$bets[112] = array('price' => 112'time' => 15);
$bets[120] = array('price' => 120'time' => 16);

while( list(
$k,$x) = each($bets)) { 
            
//текущий массив
            
$y key($bets); 
            
// если нету у нас временных файлов и это единчиная цифра 
            
if(!$tmp) {
               
// если у нас есть будущая
               
if ($y == ($k+1)) {
                  
$tmp 1;
                 
// print $y .'=='.( $k+1).'<br>';
               
}
            } else { 
####################### 
                 
if ($y == $k+1) {
                     unset(
$bets[$k+1]);
                     continue;
                 }
                 
                 
$bets[$k]['price'] =  ($bets[$k]['price']) . '-'$x['price']; 
                 
$tmp 0
            } 
        
############################### 
        

?>


я переделал немного скриптик под мои нужны с ключами, и блин почему-то больше 2ух чисел он не хочет объединять(
еще вопросик. а может это можно сделать сразу же при вытаскивании из базы? т.е. когда я делаю while($row - mysql_fetch_array()) ?
Заранее спасибо.

  Ответить  
 
 автор: heed   (22.08.2009 в 17:37)   письмо автору
 
   для: FaStY   (22.08.2009 в 15:45)
 

не пойму какие именно значения массивов надо преобразовать в такую строку
или нужны ключи ?
>>>
,$x) = each($bets)) {
//текущий массив
$y = key($bets);

Здесь в $x ассоциативный массив с двумя значениями
в $y цифра (ключ)

Там это были текущее значение и текущее значение после сдвига указателя

// было-бы всё понятно если-бы сделали print_r(each($bets));
всегда не хватало похожей функции возвращающей только текущее значение
// upd

>while($row - mysql_fetch_array()) ?
что показывает var_dump($row) ?

  Ответить  
 
 автор: FaStY   (24.08.2009 в 00:11)   письмо автору
 
   для: heed   (22.08.2009 в 17:37)
 

я опечатался, должно быть while($row = mysql_fetch_array()) ;
var_dump выдает там поля из базы $row = array('price'=>100, time=>'12') ну и в таком духе.
Мне нужно, чтобы у меня формировался массив например из такого:

$row[100] = array('price' => 100, 'time' => 12); 
$row[110] = array('price' => 110, 'time' => 13); 
$row[111] = array('price' => 111, 'time' => 14); 
$row[112] = array('price' => 112, 'time' => 15); 
$row[120] = array('price' => 120, 'time' => 16); 


в такой:
$row[100] = array('price' => 100, 'time' => 12); 
$row[112] = array('price' => '110-112', 'time' => 15); 
$row[120] = array('price' => 120, 'time' => 16); 

т.е. удалить
$row[110] = array('price' => 110, 'time' => 13); 
$row[111] = array('price' => 111, 'time' => 14); 

а $row[120] превратить в
$row[112] = array('price' => '110-112', 'time' => 15); 

  Ответить  
 
 автор: heed   (24.08.2009 в 11:04)   письмо автору
 
   для: FaStY   (24.08.2009 в 00:11)
 

если на php , обычно у меня получаются такие функции , которые надо вызывать в цикле и после него
<pre><?php
$outrow 
= array();

$m_resurs[100] = array('price' => 100'time' => 12); 
$m_resurs[110] = array('price' => 110'time' => 13); 
$m_resurs[111] = array('price' => 111'time' => 14); 
$m_resurs[112] = array('price' => 112'time' => 15); 
$m_resurs[120] = array('price' => 120'time' => 16);

function 
row_delay($row = array('price' => false)) {
                
# $row текущий массив
 
global $outrow;              # записываемый массив
 
static $temprow =     array('price' => false); # предидуший массив
 
static $tmp 0# первая цифра последовательности
###
if(!$tmp) {
 if (
$temprow['price']) {
    if (
$row['price'] == $temprow['price']) $tmp =  $temprow['price'];
    else 
$outrow[] = $temprow;
 }
}
else if (
$row['price'] != $temprow['price']) {
    
$temprow['price'] = $tmp .'-'$temprow['price'];
    
$outrow[] = $temprow;
    
$tmp 0;
}
 
$temprow $row;
###
}// row_delay()

#========================================
foreach($m_resurs AS $row){ // то-же что и while($row = mysql_fetch_array())
row_delay($row);
}
row_delay();
#========================================

print_r($outrow);
?>
но возможно не будет как нужно работать , если price может быть 0
или ещё чего-нибудь, сильно не думал, ато последние волосы выпадут :)

  Ответить  
 
 автор: FaStY   (25.08.2009 в 23:50)   письмо автору
 
   для: heed   (24.08.2009 в 11:04)
 

спасибо, затестим)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования