我有一个数组,例如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);
对不起有一些错别字。我对它进行了测试,结果如预期的那样运行。 – 2ndkauboy 2010-08-29 17:21:58
$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
$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>';
如果你有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);
$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);
解决方案:
<?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)
,但我认为是矫枉过正...
缺失的行:return $ result; – masakielastic 2013-06-10 08:34:43
@masakielastic谢谢,修正:) – NikiC 2013-06-10 08:55:19
完整的迭代器解决方案是如此优雅! – 2016-03-11 09:11:50
$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);
为了加入这个俱乐部:
$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的第二个参数)。
我认为user2469998是最接近的,但没有那么好。
对于我的例子,我使用管道内爆和str_repeat函数来构建符合长度的字符串,将其分开并修剪脂肪。
$list = array('a','b','c','d');
$length = 6;
$result = array_slice(explode('|', str_repeat(implode('|', $list).'|',ceil($length/count($list)))), 0, $length);
许多方法来实现这一点,但认为我会分享我的。唯一的限制是你需要使用一个角色来爆炸和爆炸,而不是数组项目的一部分,否则爆炸者将无法正常工作。
:)
- 1. 找到长度为n的数组中最重复的元素
- 2. 将字符串重复到一定的长度
- 3. 如何复制数组特定长度的数组
- 4. 串长度以找到重复节点的长度
- 5. 验证JSON数组到特定长度
- 6. 数组长度不确定
- 7. 比较具有重复项的长度数组
- 8. 数组长度
- 9. 具有特定长度的React.PropTypes数组
- 10. 未定义的数组长度检查
- 11. 定义数组的长度与C++/C
- 12. 零长度数组
- 13. 数组长度Matlab
- 14. 数组长度 - 环
- 15. 数组长度空
- 16. 零长度数组
- 17. 合并重复到一个数组
- 18. 在n长度上的重复效果
- 19. angularjs嵌套ng重复的子长度以外的ng重复
- 20. 用相同的值填充一个固定长度的数组
- 21. 不重复测试各种长度的组合
- 22. 数组长度的Android
- 23. 数组的长度/ LongLength
- 24. Sum子数组的长度
- 25. Array.pop()乱数组的长度?
- 26. 数组中的长度
- 27. 稀疏数组的长度
- 28. HLSL中的数组长度?
- 29. 将任意长度的数组绑定到SQLite查询
- 30. 平均数组到相同的固定长度
我做了改进,蛟川男孩的回答http://stackoverflow.com/questions/3595662/repeat-array-to-a-certain-length/3595907#3595907 – Alexander 2010-08-31 13:48:55