24

I've got an associative array in PHP and want to select a random key/value pair out of it. Here's what I have so far:

Initialize.

$locations = array();

Loops through a SQL query and adds key/val pairs:

array_push($locations, "'$location_id' => '$location_name'");

Later on, I select a random index of the array:

$rand = array_rand($locations);

Rand is just a number. So locations[$rand] gives me something like:

'1' => 'Location 1'

OK great, an assoc array element. At this point, I do not know the key of this assoc array, so I've tried the following things:

foreach($locations[$rand] as $loc_id => $location_name) { 
    echo "$key : $value<br/>\n";
}

$loc_id, $location_name = each($locations[$rand]);

$location_name = $locations[key($rand)];

None of these 3 attempts work. They all throw errors like "Passed variable is not an array".

I'm sure there's some simple 1 liner that can pluck a random key/value pair from the array. Or my syntax is off. I'd really appreciate the help.

Peter O.
  • 32,158
  • 14
  • 82
  • 96
Jeff
  • 717
  • 2
  • 8
  • 19

4 Answers4

39
$array = array('a' => 1, 'b' => 2);
$key = array_rand($array);
$value = $array[$key];
Arnaud Le Blanc
  • 98,321
  • 23
  • 206
  • 194
  • Your problem is in `array_push($locations, "'$location_id' => '$location_name'");`. Do this instead: `$locations[$location_id] = $location_name;`. Then `array_rand($location)` will return a random `$location_id`; and you can get the name with `$name = $locations[$location_id]`. – Arnaud Le Blanc Aug 26 '11 at 18:46
  • you're all correct, of course - i just picked this one bc i work best with example code. and yeah, i'm pretty embarrassed about the push not being correct. i code a ton in perl (w hashes) so i should have known better! THANK YOU! – Jeff Aug 26 '11 at 19:08
  • nice , you saved my day – Shahrokhian Jan 29 '14 at 16:01
6

array_rand() returns a key from the array, not a value. You can just use:

$location_name = $locations[$rand];

To get the location name.


Here's a full example: http://codepad.org/zR2YdMGN

Just click submit a few times, you'll see the random working.

Paul
  • 139,544
  • 27
  • 275
  • 264
1

your push is wrong

$locations[$location_id] = $location_name;

it should be

so, there is nothing about selecting random element in your question.
always debug your code, just to see if you have proper data before using it

Your Common Sense
  • 156,878
  • 40
  • 214
  • 345
1

You can do it with one line:


$randomValue = array_rand(array_flip(['value_1', 'value_2']))

You will get the value right away instead of the key.

leealex
  • 1,473
  • 1
  • 17
  • 24