通过从两个不同的数组中随机选择键和值将两个数组组合成一个数组

Posted

技术标签:

【中文标题】通过从两个不同的数组中随机选择键和值将两个数组组合成一个数组【英文标题】:Combine two arrays into one array by picking keys & values randomly from two different arrays 【发布时间】:2014-06-24 16:01:01 【问题描述】:
$arr1 = array(
   "William",
    "Henry",
    "Filbert",
    "John",
    "Pat",
);

$arr2 = array(
   "Smith",
    "Jones",
    "Winkler",
    "Cooper",
    "Cline",
);

我想将这 2 个数组组合成 1 个数组以获得 First Name => Last Name 组合。现在我不想只循环遍历一个数组,然后再循环另一个数组。我想从 $arr1 中选择随机名字,然后从 $arr2 中选择随机姓氏并将它们组合起来。

我的做法是这样的:

shuffle($arr1);
shuffle($arr2);
$arr3 = array_combine($arr1, $arr2);

我的方法是正确的还是有更好的方法?我还需要一种处理重复值的方法。

【问题讨论】:

您是想列出所有可能的组合,还是只是简单的混合/随机列表?有几种方法可以做到这一点。只要您知道如何使用$arr3,您所拥有的就会一直有效。 怎么会有重复值?你是说名字和姓氏相同的人吗? @HalfCrazed 任何一个都适合我。很可能只组合 2 个数组就足以满足我的应用程序。 @nikola 如果有人在数组中有相同的名字(键),第二个将覆盖 @GGio 好的,所以你不能使用姓氏作为键 【参考方案1】:
shuffle( $arr1 );
shuffle( $arr2 );

$out = array_map( function( $a, $b )  return array( 'first' => $a, 'last' => $b ); , $arr1, $arr2 );

/*
Array
(
    [0] => Array
        (
            [first] => Pat
            [last] => Smith
        )

    [1] => Array
        (
            [first] => William
            [last] => Cooper
        )

    [2] => Array
        (
            [first] => Filbert
            [last] => Cline
        )

    [3] => Array
        (
            [first] => Henry
            [last] => Jones
        )

    [4] => Array
        (
            [first] => John
            [last] => Winkler
        )

)

【讨论】:

但这不会进行随机选择。这只是将数组 1 的第一个元素映射到数组 2 的第一个元素 映射后你总是可以做$name = $out[mt_rand(0, count($out) - 1)]

以上是关于通过从两个不同的数组中随机选择键和值将两个数组组合成一个数组的主要内容,如果未能解决你的问题,请参考以下文章

通过从数组中选择来创建排列

高效地将 JavaScript 键和值数组转换为对象

如何将对象数组操作为不同的键和值? [复制]

如何使用 Swift 将具有两个不同键的两个值存储到数组或字典中? [关闭]

使用javascript删除与对象的另一个键和值对相对应的对象数组中的重复项

如何从嵌套 Json 数组角度 2 打印和分离键和值并将其添加到选择框中