【问题标题】:Array values split over multiple, random and unique array entries between two numbers in PHP数组值在 PHP 中的两个数字之间拆分为多个、随机和唯一的数组条目
【发布时间】:2014-02-22 14:14:49
【问题描述】:

我已经生成了一个包含 (n) 个随机唯一值 (cols) 在数字 0 和 1080 之间的数组。我现在需要在 x 个键(行)上随机插入这些值。这些行还需要是随机且唯一的,并且介于“0”和“1880”之间。

所以,如果我有 8 个介于 0 和 1080 之间的随机值

Array ( 
    [0] => 94 
    [1] => 337 
    [2] => 601 
    [3] => 751 
    [4] => 793 
    [5] => 864 
    [6] => 923 
    [7] => 1047 
)

我需要这些是唯一的键值,并且在 0 到 1880 之间随机选择,如下所示:

Array ( 
    [5] => 94 
    [105] => 337 
    [621] => 601 
    [827] => 751 
    [852] => 793 
    [1087] => 864 
    [1310] => 923 
    [1781] => 1047 
)

如果值的数量大于可用键的数量 (0-1800),我需要这些键来保存一个值数组,在条目上随机拆分。

示例:(0 - 20 之间的 5 个唯一随机值(列)和(0 - 10 之间的 3 个随机键(行))

Array ( 
    [0] => Array (
        [0] => 1 
        [1] => 4
    ) 
    [3] => Array (
        [0] => 11
        [1] => 15
    ) 
    [7] => 18 
)

我已经知道如何在 JavaScript 中进行此操作,但我不确定如何将其转换为 PHP。我也觉得“随机函数”可以使用一些改进,因为它现在可能会导致接近无限循环。

jsbin 可以be found here.

【问题讨论】:

  • 是否允许 array(15 => 15)(重复的键和值)、array(15 => 21, 18 => 21)(重复的 2 个值)?

标签: php


【解决方案1】:

首先,您可以迭代并生成您的数组: (使用while循环,否则你可能会生成两次相同的键,并以长度为n-1的数组结束)

$m = 3;
$n = 10;

$tmp_array =  array();
while (count($tmp_array)< $n){ //ensures unique keys, upto 10. NOTE: don't do this for large n's, it might take serious amount of time - for n > 1800 it'll never stop!
  $tmp_array[mt_rand(0,1800)] = mt_rand(0,1800);
}

但是,您将数字分配给“组合”键的最后一步会消除很多随机性 - 或者您还应该采取类似的选项

Array ( 
    [0] => Array (
        [0] => 1 
    ) 
    [3] => Array (
        [0] => 11
        [1] => 15
        [2] => 17
    ) 
    [7] => 18 
)

作为有效结果。

我会创建一个所需长度的数组(m),最后根据index % m推送上面的每个条目

要获得所需的输出,您需要创建另一个所需长度的数组m,再次迭代n,选择所有尺寸最小的数组,(如果超过1个从该列表中随机选择一个) 推动价值。

类似:

   $finalArray = array();

  for ($i=0; $i<$m;$i++){
    $finalArray[] = array(); //create empty arrays.
  }

  //push values of prior generated to the least filled array.
  foreach ($tmp_array as $key=>$value){
    $idx = findNext($finalArray);
    $finalArray[$idx][] = $value; 
  }

  echo "<pre>";
  print_r($finalArray);
  echo "</pre>";

  function findNext(&$array){
    $idx = null;
    $length = null;

    $i = -1;
    foreach ($array AS $var){
       $i++; 
      if ($length === null || count($var) < $length){
         $length = count($var);
         $idx = $i;
      }
    }

    return $idx;
  }

注意:未经测试,甚至可能无法运行:)

【讨论】:

  • 嗨@dognose,感谢您的宝贵时间!这些值在您的代码中是随机的,但不能保证它们是唯一的。密钥有问题,它们不是随机的。 Array ( [0] =&gt; Array ( [0] =&gt; 258 [1] =&gt; 989 [2] =&gt; 1148 [3] =&gt; 451 ) [1] =&gt; Array ( [0] =&gt; 60 [1] =&gt; 32 [2] =&gt; 62 ) ... )
【解决方案2】:
$values = range(0, 1800);
shuffle($values);
$values = array_slice($values, 0, 8);

$keys = range(0, 1800);
shuffle($keys);
$keys = array_slice($keys, 0, 8);

$wowThatWasEasyIShouldReallyLearnToReadTheManualToBeAbleToComeUpWithTrivialStuffLikeThisMyself = array_combine($keys, $values);
var_dump($wowThatWasEasyIShouldReallyLearnToReadTheManualToBeAbleToComeUpWithTrivialStuffLikeThisMyself);

// 好的,仅第一部分 - 对于“比键更多的值”,请自己弄清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    相关资源
    最近更新 更多