【问题标题】:Join two PHP arrays randomly?随机加入两个 PHP 数组?
【发布时间】:2011-06-16 19:27:40
【问题描述】:

一个数组是

Array ( 
[0] => love 
[1] => home 
[2] => google 
[3] => money 
)

另一个是

Array ( 
[0] => 111
[1] => 222
[2] => 333 
[3] => 444 
[4] => 555 
[5] => 666 
[6] => 777 
[7] => 888 
)

我想制作如下所示的第三个数组:

Array ( 
[love] => 111
[google] => 222
[home] => 333 
[love] => 444 
[google] => 555 
[money] => 666 
[money] => 777 
[google] => 888 
)

所以,它应该从第一个数组中随机选择一些元素并将它们连接到第二个数组中的所有元素。

【问题讨论】:

  • 你的结果是不可能的 - 那里有重复的数组键。
  • 您的最终数组实际上不是有效数组。同一个键不能有多个条目。
  • 您的输出数组中每个键都有多个副本。你不能这样做,因为你会一直覆盖同一个键。
  • 按照您描述的方式,在第三个数组中具有多次相同的键是不可能的。它只会覆盖该索引的先前值。如果您首先描述您真正想要实现的目标/原因,也许是最好的。

标签: php arrays random


【解决方案1】:

如前所述,创建这样的数组是不可能的,但你可以这样做:

$words = array( 'love', 'home', 'google', 'money' );
$numbers = array( 111, 222, 333, 444, 555, 666, 777, 888 );
$result = array();
foreach($words as $word){
    $result[$word] = array();
}
$wordsmax = count($words) - 1;
foreach($numbers as $number){
    $result[$words[rand(0,$wordsmax)]][] = $number;
}

这可能会输出如下内容:

Array (
    [love] => Array (
            [0] => 222
            [1] => 888
        )
    [home] => Array (
            [0] => 555
            [1] => 666
            [2] => 777
        )
    [google] => Array (
            [0] => 333
        )
    [money] => Array (
            [0] => 111
            [1] => 444
        )
)

【讨论】:

    【解决方案2】:

    就像所有 cmets 中提到的那样,您的最终数组是不可能的。 你可以做的是这样的:

    finalArray = Array (
      [0] => [google] => 111
      [1] => [home] => 222
      [2] => [google] => 333
      ...
    )
    

    您可以这样实现(使用array_rand 表示随机数组值):

    $array3 = array();
    foreach ($array2 as $element) {
        $array3[] = array($element => $array1[array_rand($array1)]);
    }
    

    【讨论】:

      【解决方案3】:

      罢工>

      试试这个:

      $numbers = Array ( 
      [0] => 111
      [1] => 222
      [2] => 333 
      [3] => 444 
      [4] => 555 
      [5] => 666 
      [6] => 777 
      [7] => 888 
      );
      
      $text = Array ( 
      [0] => love 
      [1] => home 
      [2] => google 
      [3] => money 
      );
      $new_array = array();
      foreach($numbers as $value){
         $new_array
      }
      

      我正要尝试这个,然后我想起来了。数组键必须是唯一的 -- 换句话说,您不能在数组中有 2 个元素具有相同的键。

      【讨论】:

        【解决方案4】:

        array_combine 将使用一个数组作为键,使用一个数组作为值:http://www.php.net/manual/en/function.array-combine.php

        $keys = array ( 
          'love',
          'home',
          'google',
          'money' 
        );
        $vals = array ( 
         111,
         222,
         333, 
         444, 
         555, 
         666, 
         777, 
         888
        );
        $output = array_combine($keys, $vals);
        

        不过,这不是随机的。随机需要​​一个循环:

        $output = array();
        foreach ($keys as $k) {
         $output[$k] = $vals[array_rand($vals)];
        }
        
        
           /* output: 
        Array
        (
            [love] => 666
            [home] => 555
            [google] => 222
            [money] => 777
        )
        */
        

        键盘:http://codepad.org/7c55LvXg

        另一种方法,使用shuffle 来混合数组。这似乎产生了最好的结果:

        shuffle($keys);
        shuffle($vals);
        $output = array();
        while (count($keys) > 0 && count($vals) > 0) {
          $key = array_pop($keys);
          $output[$key] = array_pop($vals);
        }
        
        /* output: 
        Array
        (
            [love] => 555
            [money] => 777
            [home] => 444
            [google] => 333
        )
        */
        

        最后一个的键盘:http://codepad.org/BpM8RzD3

        【讨论】:

          猜你喜欢
          • 2017-09-23
          • 1970-01-01
          • 1970-01-01
          • 2011-05-21
          • 1970-01-01
          • 2017-04-13
          • 2011-01-20
          • 1970-01-01
          • 2021-06-06
          相关资源
          最近更新 更多