私は本質的にギフト グラブ バッグ (帽子から名前を引き出す) 用の PHP スクリプトを作成しています。ただし、いくつかの条件があり
ます。 -配偶者とペアになることはできません -
昨年のあなたを持て
ない -あなた自身を持つことはできません(明らかに)
私は次のようなコードを書きました:
// I'm using a multidimensional array so I can check the spouses
$array = array(
array('Husband1', 'Wife1'),
array('Husband2', 'Wife2'),
array('Husbad3', 'Wife3'),
array('Single1'),
array('Single2'),
);
// if you were to sort the above array - here is their recipients lastYear
$lastYear = array(
'Single1',
'Husbad3',
'Single2',
'Wife3',
'Husband1',
'Wife2',
'Husband2',
'Wife1',
);
// declaring an empty values
$that = array();
$n = 0;
// converts multidimensional array to 2 identical arrays
for ($row = 0; $row < count($array); $row++)
{
for ($col = 0; $col < 2; $col++)
{
if (isset($array[$row][$col]))
{
$toList[] = $array[$row][$col];
$fromList[] = $array[$row][$col];
}
}
}
echo "Last Year \n";
// creates a list for last year
for ($row = 0; $row < count($toList); $row++)
{
echo $toList[$row] . " had " . $lastYear[$row] . "\n";
}
// randomly mixes up the to the toList
shuffle($toList);
echo "This Year \n";
// pairs the multidimensional array 1 index at a time
for ($row = 0; $row < count($array); $row++)
{
for ($col = 0; $col < 2; $col++)
{
// if it exists then print it out
if (isset($array[$row][$col]))
{
// if the toList index is the same person (as in $array), or already paired (in $that array), or a spouse (in $array), or the same person as last year - RESHUFFLE
while ($array[$row][$col] == $toList[$row] or in_array($toList[$row], $that) or in_array($toList[$row],$array[$row]) or $toList[$row] == $lastYear[$row])
{
// if it takes more then 200 Shuffles - BREAK
if ($n > 200)
{
echo "I'm Broke!! \n";
exit;
}
shuffle($toList);
$n++;
}
// once you find a match, add it to $that array and move on
$that[] = $toList[$row];
echo $array[$row][$col] . " has " . $toList[$row] . "\n";
}
}
}
こことここで同様の解決策を見つけましたが、私と同じ条件ではありませんでした。エラーを処理するためのより良い方法もあるかもしれませんが、これは数回の再実行後にジョブを完了させます.
私の問題は、昨年と同じ人物とペアになる場合があることです(ほとんどの場合、最後の結果は同じ両方の年とペアになっています). while ループの何が問題になっていますか?
次の while ステートメントを想定しています。
$toList[$row] == $lastYear[$row]
私が望むように解釈されていません。しかし、理論的には正しいようです。