如何获得具有边界值的随机数组键

时间:2017-05-17 11:56:41

标签: php arrays random range filtering

我有这个阵列:

$tz = array(
    'Usa' => '-7',
    'Ecuador' => '-5',
    'Bolivia' => '-4',
    'Uruguay' => '-3',
    'London' => '0',
    'France' => '2',
    'Spain' => '2',
    'Germany' => '2',
    'Greece' => '3',
    'Rusia' => '3',
    'Romania' => '3',
    'Pakistan' => '5',
    'China' => '8' 
);

我的目标是从偏移> = 0和< ='3'的那些国家/地区获取一个随机国家/地区。

我试过了:

$country = array_rand($tz);
echo 'Key: "'.$country.'" offset: "'.$tz[$country].'"<br>';

返回 关键:“罗马尼亚”抵消:“+3:00”,但我知道......不是正确的方式。

怎么做?有什么帮助吗?

正如MrRP说这个问题已经解决了

$filtered = array_filter($tz, function($v) { return $v >= 0 && $v <=3; });
$country = array_rand($filtered);
echo 'Key: "'.$country.'" offset: "'.$filtered[$country].'"<br>';

4 个答案:

答案 0 :(得分:2)

$filtered = array_filter($tz, function($v) { return $v >= 0 && $v <=3; });

然后您可以在过滤后的数组上使用array_rand

答案 1 :(得分:1)

试试这个代码......

$tz = array(
   'Usa' => '-7',
   'Ecuador' => '-5',
   'Bolivia' => '-4',
   'Uruguay' => '-3',
   'London' => '0',
   'France' => '2',
   'Spain' => '2',
   'Germany' => '2',
   'Greece' => '3',
   'Rusia' => '3',
   'Romania' => '3',
   'Pakistan' => '5',
   'China' => '8' 

);

做{

   $t = array_rand($tz);

}

而(!($ TZ [$ t]的&GT; = 0)及及($ TZ [$ t]的&LT; = 3));

回声&#39 ;; print_r($ t);死亡;

答案 2 :(得分:1)

单线太容易了:

$country=array_rand(array_intersect($tz,range(0,3)));

你的回声线:

echo 'Key: "',$country,'" offset: "',$tz[$country],'"<br>'; 

说明:

创建所需的所需值范围:range(0,3); // creates [0,1,2,3]

创建一系列符合条件的国家/地区:array_intersect($tz,range(0,3));

array('London'=>'0',
      'France'=>'2',
      'Spain'=>'2',
      'Germany'=>'2',
      'Greece'=>'3',
      'Rusia'=>'3',
      'Romania'=>'3'
)

然后从列表中拔出一个随机密钥,完成!

这种方法很有效,不会产生不必要的全局变量。

在MrRP的回答中,

array_intersect()生成与array_filter()相同的过滤数组。不同之处在于我的方法只会在每次迭代(例如in_array())上执行一个条件运算,而不是在每次迭代时执行两个单独的条件:大于或等于&amp;低于或相等到。

答案 3 :(得分:0)

看看这个。无法完全理解您的查询,但我认为这可能是您想要的。

$tz = array(
    'Usa' => '-7',
    'Ecuador' => '-5',
    'Bolivia' => '-4',
    'Uruguay' => '-3',
    'London' => '0',
    'France' => '2',
    'Spain' => '2',
    'Germany' => '2',
    'Greece' => '3',
    'Rusia' => '3',
    'Romania' => '3',
    'Pakistan' => '5',
    'China' => '8'
);

$lowerBound = 0;
$upperBound = 3;

$newDataSet = array();
foreach ($tz as $key => $value) {
    if($value<=$upperBound && $value>=$lowerBound) {
        $newDataSet[] = $key;
    }
}

echo '<pre>';
print_r($newDataSet);
echo '</pre>';

// Fetch random Country from the new list
$rand_keys = array_rand($newDataSet, 1);

echo '<br>Here is a random country : '.$newDataSet[$rand_keys] . "\n";