Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Замкнутый массив?
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Замкнутый массив?

Страниц (1): [1]
 

1. RobinBad - 02 Ноября, 2014 - 12:46:32 - перейти к сообщению
Уважаемые гуру, стоит нетривиальная задача:
допустим есть массив из 30 позиций, и при различных входящих параметрах, из него должна производиться выборка последовательных 7 позиций. Проблема начинается тогда, когда первая позиция допустим должна браться из ключа 28, т.е. выбраться должны ключи:
28, 29, 30, 0, 1, 2, 3

Подскажите как это решить красиво, без километра кода? Спасибо
(Добавление)
Протупил. Решил сам:

CODE (htmlphp):
скопировать код в буфер обмена
  1. $result = array_merge($array, $array);
  2. for ($i = $startpos; $i < ($startpos+7); $i++) {
  3.   echo $result[$i];
  4. }
2. teddy - 02 Ноября, 2014 - 13:16:03 - перейти к сообщению
А что если цифры на которые Вы ориентируетесь будут превышать количество элементов в массиве? array_merge снова и снова? Улыбка Или это исключено для данной задачи?
Напишу на всякий случай решение с помощью итераторов.

PHP:
скопировать код в буфер обмена
  1. $iterator = new LimitIterator(new InfiniteIterator(new ArrayIterator($arr)),28, 7);
3. RobinBad - 02 Ноября, 2014 - 13:52:46 - перейти к сообщению
teddy пишет:
А что если цифры на которые Вы ориентируетесь будут превышать количество элементов в массиве? array_merge снова и снова? Улыбка

В моем случае $startpos всегда в пределах длины массива. Но за ответ спасибо!
4. DelphinPRO - 02 Ноября, 2014 - 14:21:13 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. // входные данные
  2. $array = array(...);
  3. $start = 28;
  4. $count = 7;
  5.  
  6. $result = array();
  7. $length = count($array);
  8. for ($i = 0; $i < $count; $i++) {
  9.     $index = $start + $i;
  10.     if ($index > $length) {
  11.         $index = $index - $length;
  12.     }
  13.     $result[] = $array[$index];
  14. }
  15.  
  16. // результат
  17. var_dump($result);
5. RobinBad - 02 Ноября, 2014 - 15:10:17 - перейти к сообщению
Спасибо, но тесты показали что Ваш код не дружит с нулем Улыбка
array(7) {
[0]=>
string(6) "29.jpg"
[1]=>
string(6) "30.jpg"
[2]=>
NULL
[3]=>
string(6) "02.jpg"
[4]=>
string(6) "03.jpg"
[5]=>
string(6) "04.jpg"
[6]=>
string(6) "05.jpg"
}
6. teddy - 02 Ноября, 2014 - 15:14:43 - перейти к сообщению
RobinBad
Не за что. Если и число 7 фиксировано, тогда Ваш вариант пойдет)

DelphinPRO
А элемент с индексом 0 куда то потерялся Улыбка
Интересно, как поступишь, если массив будет ассоциативным?)
Или например если будет $start = 153; $count = 267; а сам массив будет содержать 30 элементов?
7. MAXUS - 03 Ноября, 2014 - 05:18:12 - перейти к сообщению
RobinBad пишет:
Уважаемые гуру, стоит нетривиальная задача:
допустим есть массив из 30 позиций, и при различных входящих параметрах, из него должна производиться выборка последовательных 7 позиций. Проблема начинается тогда, когда первая позиция допустим должна браться из ключа 28, т.е. выбраться должны ключи:
28, 29, 30, 0, 1, 2, 3

Подскажите как это решить красиво, без километра кода? Спасибо


Прикольная задачка.

PHP:
скопировать код в буфер обмена
  1. $array=array(
  2.         0=>0,
  3.         1=>1,
  4.         2=>2,
  5.         3=>3,
  6.         10=>10,
  7.         11=>11,
  8.         12=>12,
  9.         13=>13,
  10.         '20'=>20,
  11.         21=>21,
  12.         22=>22,
  13.         '23'=>23,
  14.         29=>29,
  15.         30=>30
  16. );
  17. function get($array,$from_key,$number_of_elements){
  18.         $number_of_elements=(count($array)>$number_of_elements)?$number_of_elements:count($array);
  19.         $sample=array_slice($array,array_search($from_key,array_keys($array)),$number_of_elements,true);
  20.         if(count($sample)<$number_of_elements) $sample=$sample+array_slice($array,0,$number_of_elements-count($sample),true);
  21.         return $sample;
  22. }
  23. echo '<pre>';
  24. print_r(get($array,'23',7));
  25. echo '</pre>';


Кидаешь в функцию get() массив, ключ, с которого начинать выборку, и количество требуемых элементов. Причем массив может быть и ассоциативным, а ключ, соответственно, строкой. Вернет массив с элементами, начиная с ключа, длиной в количество требуемых элементов. В том числе дополнит его элементами из начала. В том числе если количество требуемых элементов больше, чем длина массива, то не будет повторять значения.
(Добавление)
Подправил чуть, чтобы исходные ключи сохранялись.
8. DelphinPRO - 04 Ноября, 2014 - 13:19:42 - перейти к сообщению
RobinBad пишет:
Спасибо, но тесты показали что Ваш код не дружит с нулем
teddy пишет:
А элемент с индексом 0 куда то потерялся

Ну вы прямо как дети Улыбка исправьте 11 строку
$index = $index - $length - 1; и ноль будет на месте.

teddy пишет:
Интересно, как поступишь, если массив будет ассоциативным?)

Это нет в начальном ТЗ. Улыбка

teddy пишет:
Или например если будет $start = 153; $count = 267; а сам массив будет содержать 30 элементов?

Добавлю проверку на допустимость значений входных данных.
9. teddy - 04 Ноября, 2014 - 17:48:47 - перейти к сообщению
DelphinPRO
Насчет нулевого индекса я конечно загнул, согласен)
Но тем не менее, в первом посте этого топика лежит более гибкое решение, а главное там всего 1 строчка...

Я конечно не против иных вариантов, наверное меня просто никто не читает)
Ну да ладно... )

 

Powered by ExBB FM 1.0 RC1