0

我几乎是一个 PHP 初学者,尽管我可以像其他人一样复制和粘贴,而且通常我可以将它分开并弄清楚发生了什么:) 这是我在这里的第一篇文章,但我得到了很多其他答案的帮助,所以感谢所有过去和希望未来的帮助!

基本上我在这里试图复制的是一个马术障碍赛,其中每次击倒一个杆子等于四个错误,并且超过允许的时间给出时间错误。所有跳得干净的马,即零失误的马,都会进入跳线回合,在那里他们可能会或可能不会出现错误。

我当前的问题是使用 for 和 foreach 循环来推进两个不同的数组。我遇到的问题是,如果我让一个阵列工作,另一个就会停止。其中一个数组需要打乱,另一个需要按数字顺序排序。基本上它是一个随机化器,它将获取一系列马匹并给它们放置位置,然后分配一个权重随机数的错误(这是用于马游戏,书呆子,我知道)。这是我正在使用的代码:

索引.php

<form action="classes.php" method="post">
    How many classes do you wish to randomize?<br />
    <input type="text" name="number"><br />
    <input type="submit" /><br />
</form>

类.php

<form action="action.php" method="post">
<?php
$number = $_POST['number']; //This is the desired value of Looping
echo '<input type="hidden" value="' . $number . '" name="number">';
$i = 1; //First we set the count to be zero
while ($i<=$number) {
    echo '

    Class: <input type="text" name="class' . $i . '"><br />
    <textarea cols="100" rows="20" name="entries' . $i . '"></textarea><br />
    <br />';
    $i++; //Increase the value of the count by 1
};
?>
<input type="submit" /><br />
</form>

动作.php

$number = $_POST['number']; //This is the desired value of Looping

function array_rand_weighted($values) {
    $r = mt_rand(1, array_sum($values));
    foreach ($values as $item => $weight) {
        if  ($r <= $weight) return $item;
        $r -= $weight;
    }
}

for ($i=1; $i<=$number; $i++) {
    $class[$i] = $_POST['class'.$i];

    //trim off excess whitespace off the whole
    $text[$i] = trim($_POST['entries'.$i]);

    //explode all separate lines into an array
    $textAr[$i] = explode("\n", $text[$i]);

    //trim all lines contained in the array.
    $textAr[$i] = array_filter($textAr[$i], 'trim');

    //shuffle the results
    shuffle($textAr[$i]);

    //add faults
    //loop through the lines
    echo '<div id="output">
    [b]' . $class[$i] . '[/b]<br />'; 
    foreach($textAr[$i] as $key[$i]=>$line[$i]){
        $knockdowns = array( 0 => 20, 1 => 25, 2 => 30, 3 => 10, 4 => 8, 5 => 7); // knockdowns
        $knockdowns = array_rand_weighted($knockdowns)*4;
        $timefaults = array( 0 => 75, 1 => 10, 2 => 10, 3 => 5); // time faults
        $timefaults = array_rand_weighted($timefaults);

        $faultsadded = $knockdowns + $timefaults;

        $faults[$i] = $faultsadded;
    }

    asort($faults);

    foreach($textAr[$i] as $key[$i]=>$line[$i]){
        echo $key + 1,". " . $line . " (" . $faults[$i] . " Faults)<br />"; 
    }
    echo '</div>';
}

目前,这段代码正在产生我需要的随机结果,但不是错误。当我能够让它产生全套故障时,随机马的列表停止运行。我从来没有能够按价值顺序(0-20+)对故障进行排序。我使用 array_combine 找到了另一个答案,并认为也许可以使用它,但我需要密钥(我想 - 也许我真的不需要?)。

如果你想看到它的实际效果,这里是链接:http ://www.eecreates.com/randomizer/dhjc%20randomizer/它是一个多类随机化器,所以在第一页你输入你想要的类数随机化,然后在下一页输入班级名称和输入的马匹。

我要的最终产品看起来像这样:

表演跳跃班

  1. 一分钱(0 个错误 | 0 个错误)
  2. 谢尔顿(0 个故障 | 4 个故障)
  3. raj (4 个错误)
  4. 伦纳德(5个错误)
  5. 霍华德(8个错误)
  6. 艾米·法拉·福勒 (8 个错误)
  7. 伯纳黛特(9 个错误)

我还希望它为那些一开始为零的马展示第二组错误,但当然一次只有一件事。:) 谢谢!

4

1 回答 1

0

全新的答案。index.php 保持不变。我重新编写了 classes.php 中的代码以使用命名数组。这简化了 action.php 中的处理。有关这方面的说明,请参见下文。此处的代码需要包装在合适的 HTML 页面布局中。

请注意,尽管代码更改非常广泛,但我已将数据结构的更改降至最低。如果我从头开始,这不一定是我处理数据结构的方式。

类.php

<form action="action.php" method="post">
<?php
 $number = $_POST['number']; //This is the desired value of Looping
 echo '<input type="hidden" value="' . $number . '" name="number">';
 $i = 1; //First we set the count to be zero
 while ($i<=$number) {
   echo '

   Class: <input type="text" name="class[]"><br />
   <textarea cols="100" rows="20" name="entries[]"></textarea><br />
   <br />';
   $i++; //Increase the value of the count by 1
 };
?>

<input type="submit" /><br />
</form>

动作.php

我已经将加权随机故障代码移到了它自己的函数中。由于来自 classes.php 的数据现在已经是数组形式,因此我简化了处理,并将其与输出分开。一旦处理完成并生成错误数量,一对嵌套循环将按类和进入者生成输出。

<?php

function array_rand_weighted($values) {
    $r = mt_rand(1, array_sum($values));
    foreach ($values as $item => $weight) {
        if  ($r <= $weight) return $item;
        $r -= $weight;
    }
}

// generate a random value for faults and return in sorted order, ascending.
function generateFaults($numEntries) {

$faults = array();
  while ($numEntries) {
  $knockdowns = array( 0 => 20, 1 => 25, 2 => 30, 3 => 10, 4 => 8, 5 => 7); // knockdowns
  $knockdowns = array_rand_weighted($knockdowns)*4;
  $timefaults = array( 0 => 75, 1 => 10, 2 => 10, 3 => 5); // time faults
  $timefaults = array_rand_weighted($timefaults);
  $faults[] = $knockdowns + $timefaults;
  $numEntries--;
}
//  echo nl2br(print_r($faults, true));
sort($faults);
return $faults;
}

$textAr = array();
$faults = array();
// Iterate over the entries array, extracting the names of our entrants.
foreach ( $_POST['entries'] as $entries) {

    //explode all separate lines into an array
  $tempEntries = explode("\n", $entries);
  //shuffle the results
  shuffle($tempEntries);

  //trim all lines contained in the array and assign to next entry in $textAr
  $textAr[] = array_filter($tempEntries, 'trim');
  //add faults
  $faults[] = generateFaults(count($tempEntries));
}
//loop through the lines
//  echo nl2br(print_r($faults, true));

for ($i=0; $i<count($_POST['class']); $i++) {
  echo '<div id="output">
  <b>' . $_POST['class'][$i] . '</b><br />'; 

  for($j = 0; $j<count($textAr[$i]); $j++) {
  echo $j + 1,". " . $textAr[$i][$j] . " (" . $faults[$i][$j] . " Faults)<br />"; 
}
echo '</div>';
}
?>

脚注:

于 2013-06-13T03:12:52.270 回答