删除条目时PHP数组搜索不起作用

删除条目时PHP数组搜索不起作用,php,arrays,random,Php,Arrays,Random,这个示例代码让我头疼。我试图从数组中得到2个随机值。删除选择的2个条目,然后继续,直到选择了所有元素。我的问题是,前1-2次选择效果很好,但选择的值不在数组中,有时选择相同的值2次…删除2条未设置的行时,代码正常。。。 我相信这是关于删除后数组的重新索引,但是行“$number=array\u values($number)”应该可以完成这项工作 <?php $number=array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);//range(1,10);

这个示例代码让我头疼。我试图从数组中得到2个随机值。删除选择的2个条目,然后继续,直到选择了所有元素。我的问题是,前1-2次选择效果很好,但选择的值不在数组中,有时选择相同的值2次…删除2条未设置的行时,代码正常。。。 我相信这是关于删除后数组的重新索引,但是行“$number=array\u values($number)”应该可以完成这项工作

    <?php

$number=array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);//range(1,10);

//var_dump($number)." - ";//

for ($p = 1; $p <= 5; $p++) {
    echo "Nr. :".$p."</br>";
    echo implode(",",$number)."</br></br>";

    $udtrak = array_rand($number,2); // udvælger 2
    $pos[0] = array_search($udtrak[0], $number);
    $pos[1] = array_search($udtrak[1], $number);
    echo "Number: ".$number[$pos[0]]." Found at: " . $pos[0]."</br>";
    echo "Number: ".$number[$pos[1]]." Found at: " . $pos[1]."</br>";

    //unset($number[$pos[0]]);
    //unset($number[$pos[1]]);
    //var_dump($pos);    

$number=array_values($number);

echo implode(",",$number)."</br></br>";
} // for $p


?>

返回一个键数组。 如果在输入中找到值,则按值搜索并返回键

因此,您的代码片段选择
$number
的随机键,然后搜索与该键相等的值。那不是你想要的

无需进行数组搜索,只需使用
array\u rand()
选择的键:

$number=array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);//range(1,10);
for ($p = 1; $p <= 5; $p++) {
    echo "Nr. :".$p."</br>";
    echo implode(",",$number)."</br></br>";

    $pos = array_rand($number,2);
    echo "Number: ".$number[$pos[0]]." Found at: " . $pos[0]."</br>";
    echo "Number: ".$number[$pos[1]]." Found at: " . $pos[1]."</br>";

    unset($number[$pos[0]]);
    unset($number[$pos[1]]);

    $number=array_values($number);

    echo implode(",",$number)."</br></br>";
} // for $p
$number=数组(1,2,3,4,5,6,7,8,9,10)//范围(1,10);
for($p=1;$p返回一个键数组。
如果在输入中找到值,则按值搜索并返回键

因此,您的代码片段选择
$number
的随机键,然后搜索与该键相等的值。这不是您想要的

无需进行数组搜索,只需使用
array\u rand()
选择的键:

$number=array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);//range(1,10);
for ($p = 1; $p <= 5; $p++) {
    echo "Nr. :".$p."</br>";
    echo implode(",",$number)."</br></br>";

    $pos = array_rand($number,2);
    echo "Number: ".$number[$pos[0]]." Found at: " . $pos[0]."</br>";
    echo "Number: ".$number[$pos[1]]." Found at: " . $pos[1]."</br>";

    unset($number[$pos[0]]);
    unset($number[$pos[1]]);

    $number=array_values($number);

    echo implode(",",$number)."</br></br>";
} // for $p
$number=数组(1,2,3,4,5,6,7,8,9,10);//范围(1,10);

对于($p=1;$p如果您不想看到任何重复的机会,只需从一开始就将数组洗牌一次,并成对输出数据。不需要
计数器
。这也不会删除任何数组元素,因此您可以再次“downscript”使用它们。我的方法使用“不要重复您自己”编码原理,不进行迭代函数调用(好吧,我猜排序时会这样)

代码:()

可能的产出:

Number: 2 Found at: 1
Number: 1 Found at: 0
Number: 5 Found at: 4
Number: 3 Found at: 2
Number: 6 Found at: 5
Number: 4 Found at: 3
Number: 7 Found at: 6
Number: 8 Found at: 7
Number: 10 Found at: 9
Number: 9 Found at: 8
…嗯,也许更有效的排序是:

$mid=getrandmax()/2;
uksort($numbers, function()use($mid){return rand()>$mid;});  // shuffle and preserve indexes

最后,如果您想让输入完全不受影响,可以将索引数组洗牌(这可能是我最推荐的选项)

代码:()


如果您不想看到任何重复的机会,只需从一开始将数组洗牌一次,并成对输出数据。不需要
计数器
。这也不会删除任何数组元素,因此您可以再次使用它们“downscript”。我的方法使用“不要重复您自己”编码原理,不进行迭代函数调用(好吧,我猜排序时会这样)

代码:()

可能的产出:

Number: 2 Found at: 1
Number: 1 Found at: 0
Number: 5 Found at: 4
Number: 3 Found at: 2
Number: 6 Found at: 5
Number: 4 Found at: 3
Number: 7 Found at: 6
Number: 8 Found at: 7
Number: 10 Found at: 9
Number: 9 Found at: 8
…嗯,也许更有效的排序是:

$mid=getrandmax()/2;
uksort($numbers, function()use($mid){return rand()>$mid;});  // shuffle and preserve indexes

最后,如果您想让输入完全不受影响,可以将索引数组洗牌(这可能是我最推荐的选项)

代码:()


展示一个预期输出的示例。为什么不在开始时洗牌一次,然后在每次迭代前拉出两个元素?这样就永远不会有重复。展示一个预期输出的示例。为什么不在开始时洗牌一次,然后在每次迭代前拉出两个元素?这样就不会有重复,ev这也不会修改/破坏输入数组——但是,它确实改变了项目的顺序(这听起来像是在修改).Hi-我试图模拟一个游戏,在这个游戏中,两个选择的值之间的差异将在数组中设置。因此,以后必须有重复的值…以后,但不在这个循环中?请提供更多详细信息,以便我提供最好的建议。@steen,你打算解释你的最后一个评论吗?这个问题将要去哪里?这也是不修改/销毁输入数组——但是,它确实更改了项的顺序(这听起来像是在修改).Hi-我试图模拟一个游戏,在这个游戏中,两个选择的值之间的差异将在数组中设置。因此,以后必须有重复的值…以后,但不在这个循环中?请提供更多详细信息,以便我提供最好的建议。@steen,你打算解释你的最后一个评论吗?这个问题要问什么?嗨,Simon。非常感谢。今晚我要试一试。嗨,西蒙。非常感谢。今晚我要试一试。