Сначала я создал массив, скажем, из 6 элементов. Затем я случайным образом выбираю 4 элемента, которые являются ХОРОШИМИ (я имею в виду случайную позицию).

Теперь я хочу случайным образом выбрать 2 из 4 ОЧЕНЬ ХОРОШИХ. Если значение array1 совпадает с array2, то я хочу, чтобы он сказал ОЧЕНЬ ХОРОШО. Иначе скажи ХОРОШО. Если значение 0, то ПЛОХО.

Я перепробовал все возможности, но ничего не вышло.

Это моя последняя попытка сделать это ...

$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 ТОВАРОВ, и из этих 4 я хочу 2/4 ОЧЕНЬ ТОВАРОВ.

Как я могу это сделать?

Заранее спасибо Влад

0
Vlad Vornicu 24 Авг 2014 в 15:25
$array = $array + array_fill(1, 6, FALSE);? Может быть, здесь должен быть $array1?
 – 
u_mulder
24 Авг 2014 в 15:30
Извините, я ошибся здесь. В коде есть $ array1 ...
 – 
Vlad Vornicu
24 Авг 2014 в 15:31
 – 
kero
24 Авг 2014 в 15:46
Что вы имеете в виду, говоря «не могу воспроизвести»?
 – 
Vlad Vornicu
24 Авг 2014 в 15:48
Когда я использовал ваш код и немного отформатировал его, я понял, что получаю 4/6 товаров и 2/4 очень товаров, так в чем проблема?
 – 
kero
24 Авг 2014 в 15:50

1 ответ

Лучший ответ

Вам нужен один массив размером 6, так почему вы создаете несколько? Вы можете как-то объединить их или использовать первое при построении второго.

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

Теперь для первой задачи все, что вам нужно, это $num ber элементов, которые нужно создать, и $range. Эта функция будет делать то же, что и один из ваших циклов while(), плюс array_fill(). (демонстрация)

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;
}

Теперь переходим к более сложной части: во втором прогоне мы можем идентифицировать 2 из 4 TRUE в массиве из 6 элементов, дав им еще один $value (в качестве примера).

$data потребуется в некоторых случаях и при использовании $anon ymous функция, мы можем разрешить выполнение условия для 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;
}

Затем вы можете сделать что-то вроде этого (демонстрация)

$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);
0
kero 24 Авг 2014 в 19:16
Большое спасибо, это было именно то, что я хотел! Да благословит вас Бог, сэр!
 – 
Vlad Vornicu
24 Авг 2014 в 17:03