如何从数组中获取一个数组值?

时间:2015-09-02 06:43:20

标签: php arrays

嗨我有这样的数组

Array ( 
  [0] => stdClass Object ( 
     [id] => 1930 [value] => 20)

  [1] => stdClass Object (

     [id] => 1931 [value] => 30 ) 

  [2] => stdClass Object ( 

     [id] => 1937 [value] => 30 ) 

  [3] => stdClass Object ( 

     [id] => 1938 [value] => 20 ) 
)

我想从中获取随机数组。应该获取具有更大值(%)的Id更多时间(该值为%)。

3 个答案:

答案 0 :(得分:1)

创建另一个数组并重复数组索引的次数,然后随机获取值,这样做就可以了。

上面提到的数组将是

array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,)

答案 1 :(得分:0)

$arr = Array ( 
  (Object) array (id => 1930, value => 20),
  (Object) array (id => 1931, value => 30),
  (Object) array (id => 1937, value => 30),
  (Object) array (id => 1938, value => 20));

// count sum of all values
$sum = array_reduce($arr, function ($c, $i) { return $c += $i->value; }, 0);
// get random 
$rand = mt_rand(0, $sum);
echo $rand . "  ";
// select 1st item that sum of values >= random value
$new = array_filter($arr, function ($i) use (&$rand) { if($rand > 0 && ($rand -= $i->value) <= 0) return true; else return false; });
// change key to 0
$new = array_values($new);
echo  $new[0]->id;

答案 2 :(得分:0)

解决此问题的一种方法是列出数组中值的累积和,例如,如果值为3,1和2,则累计和将为3,4和6.然后当您想要得到一个随机元素,你生成一个1最大和之间的随机整数,然后选择累积和最小的元素,累积和小于或等于随机数。这样,被挑选的任何元素的通道都与其值成比例。

所以这是设置,创建累积总和:

var $cumsum = array();
var $sum = 0;
foreach($array as $obj) {
    $sum += $obj->value;
    array_push($cumsum, $sum);
}
var $maxsum = end($cumsum);

这是实际选择元素的函数:

function getRandomObject() {
    var $r = random(1, $max);
    if($r < $cumsum[0]) return $array[0];
    for($i = 0; $i < count($cumsum); $i++)
        if($cumsum[$i]) > $r)
            return $array[$i--];
    return $array[$i];
}

Disclaimar:我还没有测试过这段代码,所以不要指望它在复制粘贴上运行。此外,无论你使用什么代码,你应该确保它使用monte carlo方法以正确的概率返回元素。