数组值分为PHP中两个数字之间的多个,随机和唯一数组条目

时间:2014-02-22 14:14:50

标签: php

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

因此,如果我有例如0到1080之间的8个随机值

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

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

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

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

示例:(5个独特的随机值(cols)介于0 - 20之间)和(3个随机键(行)介于0 - 10之间)

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

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

jsbin可以be found here

2 个答案:

答案 0 :(得分:0)

首先,您可以迭代并生成数组:     (使用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;
  }

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

答案 1 :(得分:0)

$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);

//好的,仅限第一部分 - “比键更多的价值”,自己去弄清楚。