|
|
|
|
<?
//есть отсортированный массив в порядке возрастания
$arr = array(1, 2, 3,7, 23,24, 25,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
|
Даже не представляю с какого бока подступиться. | |
|
|
|
|
|
|
|
для: oliss
(01.03.2010 в 01:54)
| | Ну если с точки зрения алгоритма, то цикл for( ; ; ) никто не отменял.
А так... array_search + array_slice | |
|
|
|
|
|
|
|
для: 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(1, 2, 3, 4, 5, 17, 11 , 10, 77);// массив
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);
|
Работает корректно, что на маленьком лимите и большим массивом, что на большом лимите и маленьким массивом.
Кто более опытный, посмотрите ,может как -то оптимизировать ,чтоб меньше операций | |
|
|
|
|
|
|
|
для: oliss
(03.03.2010 в 08:45)
| | По-моему, достаточно склеить массив со своей копией, а дальше воспользоваться вычетом (остатком) :
$temp = array_merge($arr, $arr);
$start = array_search();
$realstart = $start % $count;
array_slice($arr, $realstart, $count); | |
|
|
|
|
|
|
|
для: 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-1 : $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 элемент меньше,но в данной задачи это не критично т.к. такая ситуация не возникнет. | |
|
|
|
|
|
|
|
для: oliss
(04.03.2010 в 07:34)
| | а чем не понравилась моя схема?
В Вашей в два раза больше массовых операций.
Позавтракаю - нарисую оптимальнее. | |
|
|
|
|