Вытаскиваем случайную пару ключ-значение из массива

Вытаскиваем случайную пару ключ-значение из массива

Вытаскиваем случайную пару ключ-значение из массива

В этой статье я расскажу и приведу пример функции, с помощью которой можно будет вытащить случайную пару, либо что-то одно (ключ или значение) из ассоциативного массива.

Так уж получается, что всех функций разработчики php не придумали. Даже первая функция, которая приходит в голову, для решение нашей проблемы - array_rand() - и та вытаскивает лишь значение ключа.

Ну что ж, придется идти длинным путем. Если такой функции нет, то давайте ее напишем.

<?
function array_rand_assoc($arr = array(), $return_value = ""){
	$rand = rand(0,(count($arr)-1));
	$counter = 0;
	foreach ($arr as $key => $value) {
		if($counter == $rand){
			switch ($return_value) {
				case 'key':
					$newArr = $key;
					break;
				case 'value':
					$newArr = $value;
					break;
				default:
					$newArr[0] = $key;
					$newArr[1] = $value;
					break;
			}
			break;
		}else{
			$counter++;
		}
	}

	return $newArr;
}
?>

Приведенная выше функция принимает в качестве первого аргумента исходный массив, а в качестве второго - значение, которое мы хотим получить.

Если с первым аргументом все понятно, то на счет второго я сделаю небольшую ремарку. Этот параметр не обязателен. Если вы его не укажете, то функция вам вернет массив, в котором будет отдельно лежать ключ и отдельно значение.

Также можно указать вторым параметром key - тогда функция вернет только ключ; либо value - тогда функция вернет только значение.

Вот несколько присеров ее использования:

$sourceArr = Array("a"=>"aaa","b"=>"bbb","c"=>"ccc","d"=>"ddd");

$first = array_rand_assoc($sourceArr); // вернет случайную пару ключ-значение
$second = array_rand_assoc($sourceArr, 'key'); // вернет ключ из случайной пары массива
$third = array_rand_assoc($sourceArr, 'value'); // вернет значение из случайной пары массива

  • Два раза перечитал текст и код, Так и не понял, зачем так все запутанно. Свич, цикл, выбор того, что возвращается. Я считаю, что эта функция излишне запутана. Ниже мой вариант. Не забывайте проверять входящие значения и оформлять код по PSR. $key, 'value' => $value, ]; }
  • Это лишь один из вариантов решения проблемы. Ведь функция пишется один раз и потом просто используется. И если это несложная функция, вроде той, что приведена в посте, то на сложность можно не обращать внимания. Ведь она выжимает из себя все, что может потребоваться: если нужен только ключ - вытаскиваем ключ, нужно только значение - вытаскиваем его. Ну и по умолчанию вытаскиваем пару. Спасибо за ваш вариант! Он тоже хорош. Единственное только, чтобы я поменял в ней, - это квадратные скобки. Увы, но почему-то еще многие хостинги не перешли на версию php 5.4., оставаясь на 5.3.
  • Да, конечно, квадратные скобки можно ставить только с версии 5.4(если я не ошибаюсь). Просто я уже привык к такой короткой записи, мне кажется это очень удобно. С остальным не могу согласиться. Вот моя аргументация: 1. С точки зрения пользователя в этой функции лишний второй аргумент. Как правило результат ее работы будет класться в переменную и из нее можно брать что угодно. Согласен, что может случиться момент, когда надо обойтись без промежуточной переменной. Тогда можно сделать так: fooBar(array_rand_assoc($myArray)['value']) 2. Эта функция имеет линейную сложность. То есть чем больше входных данных, тем дольше она будет выполняться. Как долго она будет работать, если я пихну в нее массив с миллионом индексов? А если мне надо будет сделать это несколько раз подряд? Моя функция имеет константную сложность, то есть время ее выполнения не зависит от входных данных. Единственное в ней узкое место - это функция array_rand, к сожалению я не знаю, как быстро она работает.