2009-08-07 22 views
9

Sé cómo seleccionar uno elemento aleatorio de una matriz, pero ¿qué hay de diez elementos aleatorios de una matriz de, digamos, veinte elementos? (En PHP)¿Cómo selecciono 10 elementos aleatorios de una lista en PHP?

Lo que lo hace un poco más complicado es que cada elemento en realidad tiene dos partes: un nombre de archivo y una descripción. Básicamente, es para una página web que mostrará diez imágenes aleatorias cada vez que vuelva a cargar. El formato real de estos datos en realidad no importa, aunque es bastante simple que prefiera contenerlo en texto plano o incluso codificarlo en lugar de configurar una base de datos. (Tampoco está destinado a cambiar a menudo.)

Pregunta de bonificación, no estoy seguro de si voy a hacer esto todavía - pero ¿cómo ponderarías las entradas, de modo que ciertos elementos siempre se recojan, o en menos frecuentemente que otros?

Gracias.

Respuesta

16

Cómo seleccionar uno o más elementos al azar de un array en PHP: http://us3.php.net/manual/en/function.array-rand.php

Cómo hacer elementos ponderados aleatorios:
http://20bits.com/articles/random-weighted-elements-in-php/

+0

No sabía array_and podría seleccionar más de una entrada de una matriz, pero me funcionó muy bien. – saikofish

+0

array_rand lamentablemente te ofrece una serie de valores, no claves.Eso significa, o bien hacer una gran cantidad de valores falsos (si el conjunto estático y el rendimiento es el rey): {'zapatos' => 1, 'ropa' => 1, 'foo' => 1) o usar una matriz interna_flip (siempre que valores-luego-claves son únicos). –

+0

20bits-link está roto, sin embargo hay [stackoverflow.com/questions/4726281](http://stackoverflow.com/questions/4726281) –

0
<?php 
$inarray = range(0,100); 
shuffle($inarray); 
$outarray = array_slice($inarray, 0, 20); 
?> 
21

Se podría shuffle la matriz y luego recoger la primera diez elementos con array_slice:

shuffle($array); 
$tenRandomElements = array_slice($array, 0, 10); 
0

Una matriz de matrices en PHP debería ser una buena estrategia. Usted puede guardar los datos de estos matriz en la forma que desee (no modificable, XML, etc.) y disponerlo en las matrices como por ejemplo:

Array { 
    Array (item0) { filename,description, weight,...} 
    Array (item1) { filename,description, weight,...} 
    Array (item2) { filename,description, weight,...} 
} 

continuación, puede utilizar la función array_rand para eliminar al azar artículos de la matriz Crear un valor de peso para cada entrada le permitirá elegir una entrada sobre otra utilizando algún tipo de estrategia de prioridad (por ejemplo, obtener aleatoriamente 2 elementos del conjunto, verificar el peso, elegir el que tenga un mayor peso y reemplazar el otro)

3

ejemplo # 1 array_rand() ejemplo

<?php 
$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank"); 
$rand_keys = array_rand($input, 2); 
echo $input[$rand_keys[0]] . "\n"; 
echo $input[$rand_keys[1]] . "\n"; 
?> 
0

Bono pregunta respuesta: Tome un vistazo a Roulette Wheel selection. El sitio web habla de algoritmos geentic, pero los métodos de selección son sólidos y pueden aplicarse a una variedad de ideas.

0

Tengo un código que hace lo que usted pide. Guardo una lista de enlaces de patrocinio en un archivo de texto y los selecciono al azar. Pero, si quiero sesgar el conjunto, yo uso múltiple el archivo de enlaces ;-)

Patrocinadores:

<a href="http://www.example.com">Example</a> 
<a href="http://www.example.com">Example</a> 
<a href="http://www.bbc.co.uk">BBC</a> 
<a href="http://www.google.com">Google</a> 

PHP:

$sponsor_config = 'sponsors.txt'; 
$trimmed = file($sponsor_config, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 
$op = array(); 

$limit = 20; // insurance 
$loops = 0; 
$needed = 4; 
$op[] = '<div id="sponsorship"><!-- start sponsorship -->'; 
$selected = array(); 
while ((count($selected) < $needed) AND ($loops <= $limit)) { 
    $choice = rand(0, count($sponsors)-1); 
    if(!in_array($sponsors[$choice], $selected)) $selected[] = $sponsors[$choice]; 
    $loops++; 
} 

foreach($selected as $k => $selection) { 
    $op[] = '<p class="sponsorship bg_'.($k%3+1).'">Click the link below to<br />visit our Site Sponsor:<br />'.$selection.'</p>'; 
} 

$op[] = '</div><!-- end sponsorship -->'; 
return join("\n",$op)."\n"; 

V. rápido y V.V. sucio ... pero funciona

+0

Gracias por ayudar a todos. Por ahora, he decidido que, en lugar de utilizar un esquema de ponderación, los que quiero que aparezcan todo el tiempo simplemente no se ingresarán en la matriz, y los que aparecerán aleatoriamente se elegirán fuera de la matriz. – saikofish

Cuestiones relacionadas