Array random sorteren in PHP zonder verlies keys

Ik wou een array in PHP random sorteren zonder dat ik mijn keys zou verliezen. PHP heeft namelijk al een ingebouwde random sorteerfunctie, namelijk shuffle() maar als je deze gebruikt op een array met zelf gedefinieerde keys, dan ben je die kwijt. Blijkbaar heeft PHP daartoe geen mogelijkheid om toch een array random te sorteren zonder het verlies van je eigen keys. Tijd dus om zelf een functie daarvoor te maken.

Deze functie mag je vrij gebruiken, ik heb ze zelf gemaakt en heb er ook geen licentie ofzo op geplaatst. Als je ze echter gebruikt of deelt op bijvoorbeeld een website, dan is een linkje terug natuurlijk altijd gewaardeerd :)

Ik heb dus de functie array_randsort() geschreven die een array vereist en waarbij je ook kan kiezen of de keys moeten bewaard worden of dat ze opnieuw moeten opgebouwd worden. Bijkomend voordeel is dat de functie niet de originele array wijzigt. Je kan dus perfect een array random sorteren zonder dat het origineel verandert. De functie gebruik je op een eenvoudige manier, 2 kleine voorbeeldjes:

print_r(array_randsort(array('test1' => 1,
							 'test2' => 2,
							 'test3' => 3,
							 'test4' => 4)));
print_r(array_randsort(array(1, 2, 3, 4), false));

Zoals je ziet heb ik 2 array’s gemaakt, eentje met zelf gedefinieerde keys en eentje zonder. Als je de code uitvoert, is een mogelijk resultaat:

Array
(
    [test2] => 2
    [test1] => 1
    [test4] => 4
    [test3] => 3
)
Array
(
    [0] => 2
    [1] => 1
    [2] => 3
    [3] => 4
)

Zoals je ziet, worden de keys in de eerste array behouden en in de tweede niet. Dit komt omdat we bij de tweede een false hebben meegegeven als optioneel tweede argument. Als je in de code gaat zien van de functie, zal je wel zien waarom dat zo is.

Hier is de code van de functie:

< ?php
/**
 * Randomly sorts an array
 *
 * @param array	the array to sort randomly
 * @param bool	if the keys have to be preserved
 */
function array_randsort(array $oldArray, $preserve = true)
{
		// the new array
		$newArray = array();
		// sort the keys randomly
		$arrayKeys = array_rand($oldArray, count($oldArray));
 
		// fill the new array
		foreach ($arrayKeys as $key)
		{
			if ($preserve)
				$newArray[$key] = $oldArray[$key];
			else
				$newArray[] = $oldArray[$key];
		}
 
		return $newArray;
}

Veel plezier ermee!

Plaats een reactie

Uw emailadres zal niet gepubliceerd worden.

*

U mag deze HTML tags en attributen gebruiken: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">