Выбрать часть элементов в массиве

J
На сайте с 08.06.2006
Offline
844
465

Есть массив

array("acer-liquid"=>"Acer Liquid","motorola-droid"=>"Motorola DROID","sony-ericsson-xperia-x10"=>"Sony Ericsson Xperia X10","google-nexus-one"=>"Google Nexus One","htc-desire"=>"HTC Desire","htc-evo-4g"=>"HTC EVO 4G","htc-a8181-desire"=>"HTC A8181 Desire","htc-desire-hd"=>"HTC Desire HD","htc-a6380-gratia"=>"HTC A6380 Gratia","lg-optimus-one"=>"LG Optimus One","motorola-atrix"=>"Motorola ATRIX","dell-venue"=>"Dell Venue","htc-a9191-desire-hd"=>"HTC A9191 Desire HD","samsung-gt-i9100-galaxy-s-ii"=>"Samsung GT I9100 Galaxy S II","htc-chacha"=>"HTC ChaCha","htc-desire-s"=>"HTC Desire S","htc-incredible-s"=>"HTC Incredible S","htc-salsa"=>"HTC Salsa","samsung-galaxy-pro"=>"Samsung Galaxy Pro","htc-evo-3d"=>"HTC Evo 3D","sony-ericsson-xperia-mini"=>"Sony Ericsson Xperia Mini","htc-s510e-desire-s"=>"HTC S510E Desire S","huawei-u8230"=>"Huawei U8230","sony-ericsson-live-with-walkman"=>"Sony Ericsson Live with Walkman","samsung-gt-s5360-galaxy-y"=>"Samsung GT S5360 Galaxy Y","htc-sensation-xe"=>"HTC Sensation XE","htc-sensation-xl"=>"HTC Sensation XL","motorola-razr"=>"Motorola RAZR","samsung-galaxy-ace-plus"=>"Samsung Galaxy Ace Plus","samsung-galaxy-y-duos"=>"Samsung Galaxy Y Duos","highscreen-jet-duo"=>"Highscreen Jet Duo","lg-optimus-vu"=>"LG Optimus Vu","lg-optimus-l3"=>"LG Optimus L3","sony-xperia-u"=>"Sony Xperia U","lg-optimus-l5"=>"LG Optimus L5","samsung-galaxy-pocket"=>"Samsung Galaxy Pocket","philips-w632"=>"Philips W632","sony-xperia-arc-s"=>"Sony Xperia Arc S","fly-iq245"=>"Fly IQ245","htc-desire-c"=>"HTC Desire C","htc-one-xl"=>"HTC One XL","sony-xperia-go"=>"Sony Xperia go","sony-xperia-tipo-dual"=>"Sony Xperia tipo dual","motorola-razr-i"=>"Motorola RAZR i","huawei-g300"=>"Huawei G300","zte-v880e"=>"ZTE V880E","philips-xenium-w632"=>"Philips Xenium W632","philips-xenium-w732"=>"Philips Xenium W732",

Всего 500 элементов в нем

Нужно каждый раз выбрать случайным способом 100 элементов с сохранением ключей

Как это можно сделать?

Спасибо!

S
На сайте с 13.10.2014
Offline
171
#1

Нуууу может кто посоветует более простой способ, но я-бы сделал так.

шаг раз. Циклом генерится массив с флагами, всего 500 штук

шаг два пробегается весь массив с данными + добавляется счетчик

если по номеру в счетчике есть true в первом массиве, значение выбирается

Имхо будет быстрее чем прокатывать 100 итерация по 500 элементов

J
На сайте с 08.06.2006
Offline
844
#2

silicoid, не совсем понял

черкни код (по возможности)

SONcemvo
На сайте с 06.09.2009
Offline
102
#3
array_rand($array, 100);

10 пехепешников

J
На сайте с 08.06.2006
Offline
844
#4

SONcemvo, а ключи то посрезает

дани мапов
На сайте с 06.09.2012
Offline
204
#5


function shuffle_assoc($array) {
$keys = array_keys($array);

shuffle($keys);

$i = 0;
foreach($keys as $key) {
$new[$key] = $array[$key];
$i++;
if ($i > 100) break;
}

return $new;
}
Написание и доработка скриптов (PHP, MySQL, JavaScript, jQuery) (/ru/forum/811046)
SONcemvo
На сайте с 06.09.2009
Offline
102
#6
joost:
SONcemvo, а ключи то посрезает

не посрезает, читайте мануал

Выбирает одно или несколько случайных значений из массива. Возвращает ключ (или ключи) данных случайных элементов.
S
На сайте с 13.10.2014
Offline
171
#7

дани мапов, Опередили. еще есть вариант с php.net

$phones = array("acer-liquid"=>"Acer Liquid","motorola-droid"=>"Motorola DROID","sony-ericsson-xperia-x10"=>"Sony Ericsson Xperia X10","google-nexus-one"=>"Google Nexus One","htc-desire"=>"HTC Desire","htc-evo-4g"=>"HTC EVO 4G","htc-a8181-desire"=>"HTC A8181 Desire","htc-desire-hd"=>"HTC Desire HD","htc-a6380-gratia"=>"HTC A6380 Gratia","lg-optimus-one"=>"LG Optimus One","motorola-atrix"=>"Motorola ATRIX","dell-venue"=>"Dell Venue","htc-a9191-desire-hd"=>"HTC A9191 Desire HD","samsung-gt-i9100-galaxy-s-ii"=>"Samsung GT I9100 Galaxy S II","htc-chacha"=>"HTC ChaCha","htc-desire-s"=>"HTC Desire S","htc-incredible-s"=>"HTC Incredible S","htc-salsa"=>"HTC Salsa","samsung-galaxy-pro"=>"Samsung Galaxy Pro","htc-evo-3d"=>"HTC Evo 3D","sony-ericsson-xperia-mini"=>"Sony Ericsson Xperia Mini","htc-s510e-desire-s"=>"HTC S510E Desire S","huawei-u8230"=>"Huawei U8230","sony-ericsson-live-with-walkman"=>"Sony Ericsson Live with Walkman","samsung-gt-s5360-galaxy-y"=>"Samsung GT S5360 Galaxy Y","htc-sensation-xe"=>"HTC Sensation XE","htc-sensation-xl"=>"HTC Sensation XL","motorola-razr"=>"Motorola RAZR","samsung-galaxy-ace-plus"=>"Samsung Galaxy Ace Plus","samsung-galaxy-y-duos"=>"Samsung Galaxy Y Duos","highscreen-jet-duo"=>"Highscreen Jet Duo","lg-optimus-vu"=>"LG Optimus Vu","lg-optimus-l3"=>"LG Optimus L3","sony-xperia-u"=>"Sony Xperia U","lg-optimus-l5"=>"LG Optimus L5","samsung-galaxy-pocket"=>"Samsung Galaxy Pocket","philips-w632"=>"Philips W632","sony-xperia-arc-s"=>"Sony Xperia Arc S","fly-iq245"=>"Fly IQ245","htc-desire-c"=>"HTC Desire C","htc-one-xl"=>"HTC One XL","sony-xperia-go"=>"Sony Xperia go","sony-xperia-tipo-dual"=>"Sony Xperia tipo dual","motorola-razr-i"=>"Motorola RAZR i","huawei-g300"=>"Huawei G300","zte-v880e"=>"ZTE V880E","philips-xenium-w632"=>"Philips Xenium W632","philips-xenium-w732"=>"Philips Xenium W732");  

/* */

function array_random_assoc($arr, $num = 1) {
$keys = array_keys($arr);
shuffle($keys);

$r = array();
for ($i = 0; $i < $num; $i++) {
$r[$keys[$i]] = $arr[$keys[$i]];
}
return $r;
}


print_r (array_random_assoc($phones,10));


---------- Добавлено 19.03.2015 в 18:58 ----------

SONcemvo, 5.2.10 Возвращаемый массив ключей больше не возвращается в случайном порядке.
J
На сайте с 08.06.2006
Offline
844
#8

дани мапов, Спасибо! Не думал, что все так просто можно.

Тему можно закрывать!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий