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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Замкнутый массив?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Выборка из массива по принципу замкнутого круга
RobinBad
Отправлено: 02 Ноября, 2014 - 12:46:32
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Нояб. 2014  


Помог: 0 раз(а)




Уважаемые гуру, стоит нетривиальная задача:
допустим есть массив из 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. }
 
 Top
teddy
Отправлено: 02 Ноября, 2014 - 13:16:03
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




А что если цифры на которые Вы ориентируетесь будут превышать количество элементов в массиве? array_merge снова и снова? Улыбка Или это исключено для данной задачи?
Напишу на всякий случай решение с помощью итераторов.

PHP:
скопировать код в буфер обмена
  1. $iterator = new LimitIterator(new InfiniteIterator(new ArrayIterator($arr)),28, 7);
 
 Top
RobinBad
Отправлено: 02 Ноября, 2014 - 13:52:46
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Нояб. 2014  


Помог: 0 раз(а)




teddy пишет:
А что если цифры на которые Вы ориентируетесь будут превышать количество элементов в массиве? array_merge снова и снова? Улыбка

В моем случае $startpos всегда в пределах длины массива. Но за ответ спасибо!
 
 Top
DelphinPRO
Отправлено: 02 Ноября, 2014 - 14:21:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




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);


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
RobinBad
Отправлено: 02 Ноября, 2014 - 15:10:17
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Нояб. 2014  


Помог: 0 раз(а)




Спасибо, но тесты показали что Ваш код не дружит с нулем Улыбка
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"
}

(Отредактировано автором: 02 Ноября, 2014 - 15:13:47)

 
 Top
teddy
Отправлено: 02 Ноября, 2014 - 15:14:43
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




RobinBad
Не за что. Если и число 7 фиксировано, тогда Ваш вариант пойдет)

DelphinPRO
А элемент с индексом 0 куда то потерялся Улыбка
Интересно, как поступишь, если массив будет ассоциативным?)
Или например если будет $start = 153; $count = 267; а сам массив будет содержать 30 элементов?

(Отредактировано автором: 02 Ноября, 2014 - 15:16:00)

 
 Top
MAXUS
Отправлено: 03 Ноября, 2014 - 05:18:12
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




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() массив, ключ, с которого начинать выборку, и количество требуемых элементов. Причем массив может быть и ассоциативным, а ключ, соответственно, строкой. Вернет массив с элементами, начиная с ключа, длиной в количество требуемых элементов. В том числе дополнит его элементами из начала. В том числе если количество требуемых элементов больше, чем длина массива, то не будет повторять значения.
(Добавление)
Подправил чуть, чтобы исходные ключи сохранялись.

(Отредактировано автором: 03 Ноября, 2014 - 11:33:41)

 
 Top
DelphinPRO
Отправлено: 04 Ноября, 2014 - 13:19:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




RobinBad пишет:
Спасибо, но тесты показали что Ваш код не дружит с нулем
teddy пишет:
А элемент с индексом 0 куда то потерялся

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

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

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

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

Добавлю проверку на допустимость значений входных данных.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
teddy
Отправлено: 04 Ноября, 2014 - 17:48:47
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




DelphinPRO
Насчет нулевого индекса я конечно загнул, согласен)
Но тем не менее, в первом посте этого топика лежит более гибкое решение, а главное там всего 1 строчка...

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

(Отредактировано автором: 04 Ноября, 2014 - 17:55:45)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB