Estoy teniendo una matriz, por ejemplo, con 4 elementos array("a", "b", "c", d");
¿cuál es la forma más rápida de repetir esta matriz para crear una nueva matriz con una cierta longitud, por ejemplo, 71 elementos?¿Repite la matriz hasta cierta longitud?
Respuesta
// 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);
Lo siento, tuve algunos errores tipográficos antes . Lo probé y funciona como se esperaba con el número exacto deseado en el resultado. – 2ndkauboy
$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);
probado y funciona.
Usted puede probar por sí mismo mediante la adición de esto:
echo '<pre>';
print_r($new_array);
echo '</pre>';
Si tiene PHP 5.3 disponible, también puede probar esto:
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);
Una solución sencilla utilizando each()
y reset()
y el puntero interno de la matriz:
<?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
solución utilizando 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')));
Los piratas informáticos SPL reales podría haber dejado caer el if (!$length--) break;
y en su lugar se utiliza un iterador límite: new LimitIterator(new InfiniteIterator(new ArrayIterator($values)), 0, $length)
, pero pensé que para ser una exageración ...
línea faltante: return $ result; – masakielastic
@masakielastic Gracias, corregido :) – NikiC
¡La solución completa de iteradores es tan elegante! –
$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);
con el fin de unirse a este club:
$result = call_user_func_array('array_merge', array_fill(0, ceil($size/count($array)), $array));
while(count($result) > $size) array_pop($result);
Pediste el más rápido así que hice un punto de referencia (Fuente: 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 es el más rápido pero sólo funciona para los valores de cadena con caracteres individuales (o la misma longitud si se utiliza segundo parámetro de str_split)
Creo que el usuario2469998 era el más cercano pero no tan agradable.
Para mi ejemplo, utilizo la tubería para implosionar y la función str_repeat para construir una cadena que cumpla con la longitud, explotarla y cortar la grasa.
$list = array('a','b','c','d');
$length = 6;
$result = array_slice(explode('|', str_repeat(implode('|', $list).'|',ceil($length/count($list)))), 0, $length);
Muchas formas de lograr esto, pero pensé en compartir el mío. La única restricción es que debe usar un personaje para implosionar y explotar en el que no forma parte de los elementos de la matriz o el explosor no funcionará correctamente.
:)
- 1. Repite cadena a cierta longitud
- 2. Eliminando hasta cierta línea en Vim
- 3. Generando cada combinación de caracteres hasta una cierta longitud de palabra
- 4. Postgresql seleccionar hasta que se llegue a cierta cantidad total
- 5. matriz JSON obtener longitud
- 6. Matriz de longitud cero
- 7. Regex para que coincida con palabras de cierta longitud
- 8. ¿Cómo puedo ajustar el texto a cierta longitud en Vim?
- 9. Longitud de la matriz con punteros
- 10. Buscar longitud de la matriz 2D Python
- 11. longitud de la matriz en Java
- 12. Cómo aumentar la longitud de una matriz
- 13. ¿Cómo se repite un patrón en la Vista personalizada hasta límites?
- 14. Se puede inicializar una serie Java con un solo carácter se repite a una longitud específica
- 15. OpenGL glColorPointer repite colores?
- 16. Obtener longitud de matriz de cadenas de longitud desconocida
- 17. ¿Cómo calcular la longitud euclidiana de una matriz sin bucles?
- 18. ¿Cómo encontrar la longitud de la matriz literal?
- 19. ¿Cómo obtener la longitud de la matriz del puntero C?
- 20. Cómo configurar la longitud de la matriz en C# dinámicamente
- 21. fin Mongo por la longitud de la matriz
- 22. Python: divide la matriz hasta que se cumpla determinada condición
- 23. Lectura de un Archivo de texto hasta EOF repite última línea
- 24. ¿Ajustar el texto a la siguiente línea cuando excede cierta longitud?
- 25. ¿Cuál es la 'manera de Ruby' para iterar en una matriz, desde la matriz [n] hasta la matriz [n - 1]?
- 26. ¿Cómo redistribuyo una matriz en otra matriz de cierta "forma"? PHP
- 27. Matriz de una longitud desconocida en C#
- 28. ¿Matriz de longitud desconocida en MATLAB?
- 29. Declaración de una matriz de longitud negativa
- 30. Inicializar matriz numpy de longitud desconocida
hice una mejora de la respuesta de Kau-Boy http://stackoverflow.com/questions/3595662/repeat-array-to-a-certain-length/3595907#3595907 – Alexander