从数组PHP中随机选择的元素中随机选择

时间:2014-08-24 11:25:42

标签: php arrays random

首先,我创建了一个数组,比如6个元素。然后我随机挑选4个好的元素(在我意思的随机位置上)。

现在,我想随机选择那些非常好的4个中的2个。 如果array1的值与array2相同,那么我希望它说非常好。好吧,说好的。如果值为0,则为BAD。

我尝试了所有可能性并且都失败了。

这是我最后一次这样做的尝试......

$array1 = array();
$array2 = array();
while (count($array1) < 4) {
    $rand = rand(1,6);
    if (!isset($array1[$rand])) {
         $array1[$rand] = TRUE;

    }
}

while (count($array2) < 2) {
    $rand = rand(1,4);
    if (!isset($array2[$rand])) {
        $array2[$rand] = TRUE;


    }
}


$array2 = $array2 + array_fill(1, 4, FALSE);
$array1 = $array1 + array_fill(1, 6, FALSE);

ksort($array1);
ksort($array2);

foreach($array1 as $k => $v){
    if ($v != 0)
{echo "GOOD<br>";}
else {echo "BAD<br>";}}
foreach($array2 as $kc => $vc){
    if ($v2 !=0)
{echo "VERY GOOD<br>";}
else {echo "BAD<br>";}}

这就是它给我的东西:

GOOD
GOOD
BAD
GOOD
GOOD
BAD
VERY GOOD
BAD
BAD
VERY GOOD

如你所见,它给了我4/6货物然后2/6非常好。 我想要的是4/6 GOODS,从我选择的4个中我想要2/4非常好的商品。

我该怎么做?

提前致谢, 维拉德

1 个答案:

答案 0 :(得分:0)

你想要一个大小为6的数组,为什么要创建多个?您可以以某种方式合并它们,也可以使用第二种方法构建它们。

但首先,我想指出while()循环非常相似,所以应该很容易将它放入function并保存一些代码来编写并拥有一个代码库更易于管理,因为您只需要编辑一个地方即可立即生效而不是很多。

现在,对于第一项任务,您只需要创建$num个元素和$range。此函数将执行您的while()个循环执行的操作以及array_fill()。 (demo

function fillRandom($range, $num = 1) {
    $data = array_fill($range[0], $range[1]+1, FALSE);

    for ($i=0; $i<$num; $i++) {
        do {
            $key = mt_rand($range[0], $range[1]);
        } while ($data[$key] === TRUE);
        $data[$key] = TRUE;
    }
    return $data;
}

现在出现了更高级的部分:在第二轮中,我们可以通过给出另一个TRUE(作为示例)来识别6个元素数组中的4个$value中的2个。 / p>

在某些情况下需要$data,并且使用$anonymous function我们可以允许传递while()的条件。

function fillRandom($range, $num = 1, $value = TRUE, $data = array(), $anon = NULL) {
    if (empty($data))
        $data = array_fill($range[0], $range[1]+1, FALSE);
    if ($anon === NULL) {
        $anon = function($el) use($value) {
            return $el !== $value;
        };
    }

    for ($i=0; $i<$num; $i++) {
        do {
            $key = mt_rand($range[0], $range[1]);
        } while (isSet($data[$key]) && !$anon($data[$key]));
        $data[$key] = $value;
    }
    return $data;
}

然后你可以做这样的事情(demo

$input = fillRandom(array(0, 5), 4);

ksort($input);
print_r($input);

$input = fillRandom(array(0, 5), 2, 2, $input, function($el){
    return $el === TRUE;
});

ksort($input);
print_r($input);