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

Форум PHP

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

 

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

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

тема: Выбор эллементов из массива
 
 автор: oliss   (01.03.2010 в 01:54)   письмо автору
 
 

<?
//есть отсортированный массив в порядке возрастания
$arr = array(123,723,2425,33,34,77);

$limit=3;   // сколько выбрать элементов
$start =''// с какого элемента  начать выбор 

foreach($arr as $key => $value)
{
        echo 
'['.$key.']---> '.$value.'<br />';
        
}
// как сделать выборку значений из него ?        
if($start == 3  ) --> // выбираем 3,7,23
if($start == 25 ) --> // выбираем 25,33,34
if($start == 34 ) --> // выбираем 34,77,1
if($start == 77 ) --> // выбираем 77,1,2

Даже не представляю с какого бока подступиться.

  Ответить  
 
 автор: Тень&   (01.03.2010 в 02:53)   письмо автору
 
   для: oliss   (01.03.2010 в 01:54)
 

Ну если с точки зрения алгоритма, то цикл for( ; ; ) никто не отменял.

А так... array_search + array_slice

  Ответить  
 
 автор: oliss   (03.03.2010 в 08:45)   письмо автору
 
   для: oliss   (01.03.2010 в 01:54)
 

Изменилось условие,те надо со смещением на 1 шаг вперёд вот что получилось

<?p
echo 'Лимит      ---> ' .($limit 5). '<br />'// сколько выбрать элементов
echo 'массив : 1, 2, 3, 4, 5, 17, 11, 10, 77<br/>';
echo 
'Вымираем ---> ' .($start =77). '<br />';      // с какого элемента  начать выбор 

/* $limit = 5 
if($start == 1  )  --> выбираем 2,3,4,5,17
if($start == 11 ) --> выбираем 10,77,1,2,3
if($start == 77 ) --> выбираем 1,2,3,4,5
*/

$arr = array(123451711 1077);// массив 


function _other_doc($start,$arr,$limit){
if(
in_array($start,$arr))// проверяем есть ли такой эллемент в массиве
    

        
$cnt_arr =count($arr);
        
$nn      =array_keys($arr,$start); // находим ключ ,согласно парамерту $start 
        
$n_arr   =array_slice($arr,$nn[0]+1,$limit); // получаем срез массива
        
$c_n_arr =count($n_arr); // колличество елементов в новом моссиве
//echo  $c_n_arr.' к-во элл.<br />';
        
if($c_n_arr $limit)// если колличество эл в новом массиве меньше чем $limit
            
{                
                
$stop  = ($limit $cnt_arr )? $limit-$c_n_arr $cnt_arr-$c_n_arr-1;
                
$dev_arr=array_slice($arr,0,$stop);    
                
$n_arr  =array_merge($n_arr,$dev_arr);  // сливаем массивы        
            
}
        
$n_arr implode(",",$n_arr);        
        return 
$n_arr;    
    }
else return 
false;        
}    
echo 
_other_doc($start,$arr,$limit); 


Работает корректно, что на маленьком лимите и большим массивом, что на большом лимите и маленьким массивом.

Кто более опытный, посмотрите ,может как -то оптимизировать ,чтоб меньше операций

  Ответить  
 
 автор: Trianon   (03.03.2010 в 09:11)   письмо автору
 
   для: oliss   (03.03.2010 в 08:45)
 

По-моему, достаточно склеить массив со своей копией, а дальше воспользоваться вычетом (остатком) :
$temp = array_merge($arr, $arr);
$start = array_search();
$realstart = $start % $count;
array_slice($arr, $realstart, $count);

  Ответить  
 
 автор: oliss   (04.03.2010 в 07:34)   письмо автору
 
   для: Trianon   (03.03.2010 в 09:11)
 

Ну Trianon ,вы и голова :) ,пару минут посмотрели и дали парильное направление сенкс.
<?
function _n_doc($start,$arr,$limit){
    if(
in_array($start,$arr)){
        
$count count($arr);
        
$limit $count <= $limit $limit=$count-$limit;
        
$nn    array_keys($arr,$start); 
        
$n_arr array_slice($arr,$nn[0]+1,$limit);
        
$temp  array_merge($n_arr,$arr );
        
$n_arr array_slice($temp,0,$limit);
        
$n_arr implode(',',$n_arr);
        return  
$n_arr;
      }
    else return 
false;
  }

есть небольшой баг : если значение лимит совпадает с длиной массива ,то выводится на 1 элемент меньше,но в данной задачи это не критично т.к. такая ситуация не возникнет.

  Ответить  
 
 автор: Trianon   (04.03.2010 в 08:47)   письмо автору
 
   для: oliss   (04.03.2010 в 07:34)
 

а чем не понравилась моя схема?
В Вашей в два раза больше массовых операций.
Позавтракаю - нарисую оптимальнее.

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

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