【问题标题】:PHP array_chunk, prevent duplicate chunks [closed]PHP array_chunk,防止重复块[关闭]
【发布时间】:2020-11-22 20:20:48
【问题描述】:

假设我有很多人:

$a = ['John', 'Amy', 'Bill', 'Jim']

数组可以有超过 4 个元素。

我需要为每个元素与同一数组中的另一个元素生成 2 个配对,而不生成重复配对(在可避免的情况下)或将一个元素与其自身配对:

    Array
(
[0] => Array
    (
        [0] => John
        [1] => Amy
    )


[1] => Array
    (
        [0] => Amy
        [1] => Bill
    )

[2] => Array
    (
        [0] => Bill
        [1] => Jim
    )

[3] => Array
    (
        [0] => John
        [1] => Jim
    )

)

我尝试过一些草率的技术,例如复制数组、将它们合并,然后将它们分块成对。虽然重复配对和相同的元素配对不断出现,所以我在合并和分块数组之前尝试了shuffle($duplicated_array)array_reverse($duplicated_array) 之类的东西,仍然存在重复配对。

在不创建重复配对或将元素与其自身配对的情况下,为数组中的每个元素生成 2 个配对的正确方法是什么?

提前致谢。

这是一个不能完全防止重复的尝试示例:

$duplicate_array = $a;
        shuffle($duplicate_array);
        $combined = array_merge($duplicate_array, $a);
        $combined = array_chunk($combined,2);
        

【问题讨论】:

标签: php arrays duplicates


【解决方案1】:

只需创建 2 个循环并简单检查名称是否相同。

<?php
$arr = ['John', 'Amy', 'Bill', 'Jim'];

$result = [];
foreach ($arr as $a) {
    foreach ($arr as $b) {
        if ($a === $b) continue;
        $result[] = [$a, $b];
    } 
}

print_r($result);

结果:

Array
(
    [0] => Array
        (
            [0] => John
            [1] => Amy
        )

    [1] => Array
        (
            [0] => John
            [1] => Bill
        )

    [2] => Array
        (
            [0] => John
            [1] => Jim
        )

    [3] => Array
        (
            [0] => Amy
            [1] => John
        )

    [4] => Array
        (
            [0] => Amy
            [1] => Bill
        )

    [5] => Array
        (
            [0] => Amy
            [1] => Jim
        )

    [6] => Array
        (
            [0] => Bill
            [1] => John
        )

    [7] => Array
        (
            [0] => Bill
            [1] => Amy
        )

    [8] => Array
        (
            [0] => Bill
            [1] => Jim
        )

    [9] => Array
        (
            [0] => Jim
            [1] => John
        )

    [10] => Array
        (
            [0] => Jim
            [1] => Amy
        )

    [11] => Array
        (
            [0] => Jim
            [1] => Bill
        )

)

想要一个中间名,添加3个循环等等。

<?php
$arr = ['John', 'Amy', 'Bill', 'Jim'];

$result = [];
foreach ($arr as $a) {
    foreach ($arr as $b) {
        if ($a === $b) continue;
        foreach ($arr as $c) {
            if ($a === $c || $b === $c) continue;
            $result[] = [$a, $b, $c];
        }
    } 
}

print_r($result);

【讨论】:

    【解决方案2】:

    您可以将每个名称与数组中的以下名称配对。

    $names = ['John', 'Amy', 'Bill', 'Jim'];
    
    $n = count($names);
    foreach ($names as $index => $name) {
        $pairs[] = [$name, $names[($index + 1) % $n]];
    }
    

    如果需要随机配对,您可以在配对之前将名称打乱。

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 2011-08-22
      • 2019-12-04
      相关资源
      最近更新 更多