Sto avendo un array ad esempio con 4 elementi array("a", "b", "c", d");
qual è il modo più veloce per ripetere questo array per creare un nuovo array con una certa lunghezza, ad esempio 71 elementi?Ripeti l'array ad una certa lunghezza?
risposta
// 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);
Scusa prima alcuni refusi . L'ho provato e funziona come previsto con il numero esatto desiderato nel risultato. – 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);
testato e funziona.
È possibile verificare voi stessi aggiungendo questo:
echo '<pre>';
print_r($new_array);
echo '</pre>';
Se si dispone di PHP 5.3 disponibili, si può anche provare questo:
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 soluzione semplice utilizzando each()
e reset()
e il puntatore interno dell'array:
<?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
soluzione utilizzando 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')));
I veri hacker SPL potrebbe aver lasciato cadere la if (!$length--) break;
e invece utilizzato un iteratore limite: new LimitIterator(new InfiniteIterator(new ArrayIterator($values)), 0, $length)
, ma ho pensato che per essere eccessivo ...
riga mancante: return $ result; – masakielastic
@masakielastic Grazie, risolto :) – NikiC
La soluzione iteratrice completa è così 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);
al fine di aderire a questo club:
$result = call_user_func_array('array_merge', array_fill(0, ceil($size/count($array)), $array));
while(count($result) > $size) array_pop($result);
Avete chiesto il più veloce così ho fatto un punto di riferimento (Fonte: 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 è il più veloce, ma funziona solo per i valori di stringa con i singoli caratteri (o la stessa lunghezza se si utilizza secondo parametro di str_split).
Penso che l'utente2469998 fosse il più vicino ma non proprio bello.
Per il mio esempio, uso la pipa per implodere e la funzione str_repeat per creare una stringa che soddisfi la lunghezza, farla esplodere e tagliare il grasso.
$list = array('a','b','c','d');
$length = 6;
$result = array_slice(explode('|', str_repeat(implode('|', $list).'|',ceil($length/count($list)))), 0, $length);
Molti modi per realizzare questo ma ho pensato di condividere il mio. L'unica limitazione è che è necessario utilizzare un personaggio per implodere ed esplodere su cui non fa parte degli elementi dell'array o che l'esplodice non funziona correttamente.
:)
- 1. lattice: hfill ad una certa larghezza
- 2. notifiche quotidiane ad una certa ora
- 3. Etichetta che scompare inavvertitamente dopo una certa lunghezza
- 4. Regex per abbinare parole di una certa lunghezza
- 5. Ripeti una singola canzone in una playlist
- 6. Ripeti AsyncTask
- 7. Chiedi a Hubot di parlare ad una certa ora?
- 8. portare git repo fino ad una certa revisione
- 9. Come abbinare una stringa di una certa lunghezza con una regex
- 10. Come posso limitare una stringa a non più di una certa lunghezza?
- 11. Come sapere che una sequenza generata è al massimo una certa lunghezza
- 12. Ripeti l'immagine in C#
- 13. In Groovy, come faccio ad aggiungere i valori per una certa proprietà in una mappa?
- 14. ActiveRecord seleziona un campo stringa di una certa lunghezza in Rails 3?
- 15. Sostituire una stringa corrispondente certa espressione regolare con la sua lunghezza in Vim
- 16. (re) inizializza un vettore con una certa lunghezza con i valori iniziali
- 17. Regex per abbinare un gruppo specifico di cifre di una certa lunghezza?
- 18. Come posso avvolgere il testo su una certa lunghezza in Vim?
- 19. Ripeti animazione ogni 3 secondi
- 20. Scala looping per una certa durata
- 21. Posso git svn rebase ad una certa revisione svn? (Simile a svn up -r ...)
- 22. Come posso far funzionare il mio script PHP ad una certa ora ogni giorno?
- 23. Arresta l'immagine di sfondo fissata dallo scorrimento ad una certa altezza
- 24. Come calcolare la decelerazione necessaria per raggiungere una certa velocità su una certa distanza?
- 25. Ripeti ricorsivi elementi vettoriali N volte ciascuno
- 26. Get mese di una certa data
- 27. utenti SELECT * che hanno una certa età
- 28. gerarchia di richiamo da una certa funzione
- 29. Ripeti la stringa con la moltiplicazione intera
- 30. Python: Fai qualcosa poi dormi, ripeti
ho un miglioramento alla risposta di Kau-Boy http://stackoverflow.com/questions/3595662/repeat-array-to-a-certain-length/3595907#3595907 – Alexander