【问题标题】:php get random unique value from an array without repeating & also preserve & get the keyphp从数组中获取随机唯一值而不重复&也保留&获取密钥
【发布时间】:2020-01-07 04:11:31
【问题描述】:

我是 php 新手,我正在尝试从一组让我们说 4 个值的数组中获取随机值,而不重复数组组的值并获取该值的键。我在页面上有多个地方可以回显该值。我试过 array_randshuffle() 但他们重复的值不保持唯一性。

$fruit = [
'f1' => 'mango',
'f2' => 'pear',
'f3' => 'apple',
'f4' => 'banana',
];
$key = array_keys($fruit);
$fruitvalue = $key[shuffle($key)];

在页面某处回显$key & $fruitvalue

如果我希望随机值在页面上出现 120 次,则 Shuffle()、array_rand() 并不能帮助我在 4 的单个周期中保持值的唯一性 我也不能使用 i=1;i

【问题讨论】:

  • 你只有 4 个! (=24) 个组合,所以会有一些重复?
  • 您还想输出f1f2 等值吗?
  • 输出值时使用什么作为计数器?
  • @LTPCGO 是的,重复会在那里,但我不希望它在 4 组中,假设我们有 20 个地方想要回显$fruitvalue,所以我们可以将 20 分成五组,每组 4 个;在每个组中,所有四个都将在那里并且没有重复 shuffle() 或 array_rand() 不会重复..我想实现唯一而没有重复,并且还能够调用 $key 作为它的回声
  • @Nick 是的,所以可以说回显 $fruitvalue 是芒果,我也通过回显 $key 得到 f1

标签: php arrays


【解决方案1】:

实现所需结果的一种方法是编写一个函数,该函数从$fruit 数组中返回一个随机值,遍历数组中的所有值,然后在返回下一组值之前对数组进行洗牌。由于我们不能在不丢失键的情况下shuffle 一个数组,因此此函数存储$fruit 数组的键并改组它们:

function random_fruit() {
    static $i = 0;
    static $fruit = [
        'f1' => 'mango',
        'f2' => 'pear',
        'f3' => 'apple',
        'f4' => 'banana',
    ];
    // would be nice to write:
    //   static $keys = array_keys($fruit); 
    // but PHP doesn't allow it so we have to assign the value
    // the first time we call the function
    static $keys;
    if ($i == 0) $keys = array_keys($fruit);
    $length = count($fruit);
    if ($i % $length == 0) shuffle($keys);
    return array($keys[$i % $length], $fruit[$keys[$i++ % $length]]);
}

然后每次想要新水果时,只需调用random_fruit 函数即可。例如,输出 20 个随机水果:

for ($j = 0; $j < 20; $j++) {
    list($key, $fruitvalue) = random_fruit();
    echo "$key: $fruitvalue\n";
    if ($j % 4 == 3) echo "-----\n";
}

样本输出:

f4: banana
f2: pear
f1: mango
f3: apple
-----
f4: banana
f1: mango
f3: apple
f2: pear
-----
f3: apple
f2: pear
f4: banana
f1: mango
-----
f3: apple
f1: mango
f4: banana
f2: pear
-----
f4: banana
f1: mango
f2: pear
f3: apple
-----

Demo on 3v4l.org

【讨论】:

  • 谢谢尼克,我已经有一个包含该代码的函数..在您的代码中,我认为我受到 $j
  • @Simon 我只是使用循环来演示代码。您可以根据需要多次调用该函数,并且如示例输出所示,它将继续以 4 个一组的形式返回随机水果。
  • 换句话说,每次你想要一个新的水果,只需在你的代码中输入list($key, $fruitvalue) = random_fruit();
  • 谢谢@Nick,很抱歉我是新手,我无法理解您提到的list($key, $fruitvalue) = random_fruit();。我明白你的意思是简单地调用那个函数&我想它应该给我一个列表,但我只想要一个随机值。当此 php 代码在页面上运行时,它将检查 120 个位置中的每一个并回显随机 $fruitvalue 及其密钥,这对于 4 组序列将是唯一的不重复,直到页面结束。 .
  • 因此在我们的 functions.php 中我只需要最终的 $fruitvalue 和 $key 。我已经有一个自定义函数,上面的代码是其中的一部分,我也想在你的代码末尾实现 get "$key"; &$水果值; &这两个然后在有插入的地方全局自动添加,所以我的第一个疑问是我如何组合这两个函数,或者是否需要组合两个&而不是像我在此链接中尝试的那样直接用您的代码替换我的上述代码 - @ 987654323@ 但正如我们所见,我犯了一些严重的错误。
【解决方案2】:

我会做这样的事情

$keys = shuffle(array_keys($fruit));

然后你可以使用 array_shift 来获取数组的第一个元素,同时缩短数组。

$fruit1 = $fruit[array_shift($keys)];
$fruit2 = $fruit[array_shift($keys)];
$fruit3 = $fruit[array_shift($keys)];
$fruit4 = $fruit[array_shift($keys)];

array_shift

【讨论】:

  • 但是我如何获得$fruitvalue & $key ?因为只有这两个会在页面上使用
  • $fruit[array_shift($keys)] 的输出将是水果的值。如果您还需要密钥,则将array_shift($keys) 存储在变量中。所以$fruitkey1 = array_shift($keys); $fruit1 = $fruit[$fruitkey1];
【解决方案3】:

你也可以这样做:

$k = array_rand($fruit);
$v = $fruit[$k];

当你有一个关联数组时,这是这样做的方法。

【讨论】:

  • 已经这样做了,值在 4 组中重复,我想要实现的是在 4 组中保持值唯一,即我们不希望连续四个值中有 2 个芒果
猜你喜欢
  • 2011-09-22
  • 1970-01-01
  • 2011-03-20
  • 2023-03-21
  • 2019-07-16
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多