Сначала я создал массив, скажем, из 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 ОЧЕНЬ ТОВАРОВ.
Как я могу это сделать?
Заранее спасибо Влад
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);
Похожие вопросы
Новые вопросы
php
PHP — это открытый, мультипарадигмальный, динамически типизированный и интерпретируемый язык сценариев, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.
$array = $array + array_fill(1, 6, FALSE);
? Может быть, здесь должен быть$array1
?