Повторить массив до определенной длины?

У меня есть массив, например, с 4 элементами array("a", "b", "c", d"); что самый быстрый способ повторить этот массив для создания нового массива определенной длины, например 71 элементы?

 // the variables $array = array("a", "b", "c", "d"); $desiredLength = 71; $newArray = array(); // create a new array with AT LEAST the desired number of elements by joining the array at the end of the new array while(count($newArray) <= $desiredLength){ $newArray = array_merge($newArray, $array); } // reduce the new array to the desired length (as there might be too many elements in the new array $array = array_slice($newArray, 0, $desiredLength); 

Решение с использованием SPL InfiniteIterator :

 <?php function fillArray1($length, $values) { foreach (new InfiniteIterator(new ArrayIterator($values)) as $element) { if (!$length--) return $result; $result[] = $element; } return $result; } var_dump(fillArray(71, array('a', 'b', 'c', 'd'))); 

Настоящие хакеры SPL могли бы сбросить if (!$length--) break; и вместо этого использовал new LimitIterator(new InfiniteIterator(new ArrayIterator($values)), 0, $length) итератора: new LimitIterator(new InfiniteIterator(new ArrayIterator($values)), 0, $length) , но я думал, что это будет излишним …

Чтобы присоединиться к этому клубу:

 $result = call_user_func_array('array_merge', array_fill(0, ceil($size/count($array)), $array)); while(count($result) > $size) array_pop($result); 

Вы просили быстрее, поэтому я сделал тест (Источник: http://pastebin.com/G5w7QJPU )

 Kau-Boy: 5.40128803253 Frxstrem: 5.00970411301 NikiC: 4.12150001526 user2469998: 0.561513900757 Alexander: 1.92847204208 Hammerite: 2.17130494118 Max: 12.9516701698 Evert: 1.9378361702 Christoph: 1.6862449646 Test took 35.7696909904s 

user2469998 является самым быстрым, но он работает только для строковых значений с одиночными символами (или той же длины, если вы используете второй параметр str_split).

Простое решение с использованием each() и reset() и внутреннего указателя массива:

 <?php $array = array('a', 'b', 'c', 'd'); $length = 71; $result = array(); while(count($result) < $length) { $current = each($array); if($current == false) { reset($array); continue; } $result[] = $current[1]; } echo count($result); // Output: 71 
 $newarray = array(); $i = 0; $oldarrayvalues = array_values($oldarray); $oldarraysize = count($oldarrayvalues); if ( $oldarraysize ) { while ( count($newarray) < DESIRED_ARRAY_SIZE ) { $newarray[] = $oldarrayvalues[$i]; $i++; $i %= $oldarraysize; } } 

Если у вас есть PHP 5.3, вы также можете попробовать следующее:

 function fill(array $initalArray, $toCount) { $initialArrayCount = count($initalArray); $fillUp = function(array $filledUpArray, $missingCount) use(&$fillUp, $initalArray, $initialArrayCount, $toCount) { if($missingCount <= 0) return array_slice($filledUpArray, 0, $toCount); return $fillUp(array_merge($filledUpArray, $initalArray), $missingCount - $initialArrayCount); }; return $fillUp($initalArray, $toCount - $initialArrayCount); } $theArray = array("a", "b", "c", "d"); $toLength = 71; $filledArray = fill($theArray, $toLength); print_r($filledArray); 
 <?php $array = array('a', 'b', 'c', 'd'); $end = 71; $new_array = array(); while(count($new_array) <= $end) { foreach($array as $key => $value) { $new_array[] = $value; } } $new_array = array_slice($new_array, 0, $end); 

Протестировано и работает.

Вы можете проверить себя, добавив следующее:

 echo '<pre>'; print_r($new_array); echo '</pre>'; 
 $array = array("a", "b", "c", "d"); $merge = array(); $desiredLength = 71; while(2 * count($array) <= $desiredLength){ $array = array_merge($array, $array); } if($desiredLength > count($array)) $merge = array_slice($array, 0, $desiredLength - count($array)); $array = array_merge($array, $merge); $array = array_slice($array, 0, $desiredLength); print_r($array); 
 $arr = array("a", "b", "c", "d"); $len = 71; $a = array(); $a = str_split( substr( str_repeat( join( $arr), ceil( $len / count( $arr))), 0, $len)); var_export($a); 

Я думаю, что user2469998 был ближе всего, но просто не так хорошо.

Для моего примера я использую pipe для implode и функцию str_repeat для построения строки, которая соответствует длине, взорвать ее назад и обрезать жир.

 $list = array('a','b','c','d'); $length = 6; $result = array_slice(explode('|', str_repeat(implode('|', $list).'|',ceil($length/count($list)))), 0, $length); 

Много способов добиться этого, но я думал, что поделюсь с вами. Единственное ограничение состоит в том, что вам нужно использовать символ для взлома и взрыва, на котором не входит элемент массива, или exploder не будет работать должным образом.

🙂