【问题标题】:Make sure the same array items are not next to each other in php确保相同的数组项在 php 中不相邻
【发布时间】:2020-05-30 15:23:16
【问题描述】:

我正在为这个案子而苦苦挣扎。我有一个随机数组,类似的项目可以彼此相邻,我不希望它发生。

例子:

array("red","red","blue","green","green","blue");

Expected Output : array("red","blue","red","green","blue","green")

所以我正在考虑将这些项目洗牌,直到没有类似的项目彼此相邻。但是如果数组的值很多的话,会花费很多时间。

有什么有效的方法可以实现吗?

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 目的是没有连续的元素会不一样吧?如果红色出现在(近)端并且蓝色首先出现,这不是问题吗?
  • 是的,这对我来说已经足够了

标签: php arrays shuffle


【解决方案1】:

只是一个想法:

  • 打乱原始数组。
  • 比较前两个。如果它们相同,则将第二个与最后一个交换。
  • 移到下一对。
  • 重复直到结束。

这里我们假设最坏情况下的随机播放具有相同的值。

$colors = ["red", "red", "blue", "blue", "green", "green"];

for ($i = 0; $i < count($colors) - 1; $i++) {
    if ($colors[$i] !== $colors[$i + 1]) continue;
    $last = $colors[count($colors) - 1];
    $colors[count($colors) - 1] = $colors[$i];
    $colors[$i + 1] = $last;
}

print_r($colors);

Array
(
    [0] => red
    [1] => green
    [2] => blue
    [3] => red
    [4] => green
    [5] => blue
)

【讨论】:

  • 这个想法只有在相似项目具有相同数量的情况下才有效。如果数组具有像 $colors = ["red", "red", "red", "red", "blue", "green", "green", "blue"]; 这样的值,它将无法工作。不过谢谢你的回答。
  • 最难的部分是我的数据可以这样["red","red","red","red","red","red","blue","blue","green","green","green","green","green","green","red","red","red"]
  • 当然,唯一的词越少,效果就越差。但是,如果数组足够大,那么接下来您将不会得到相同的结果。您可以运行例程并检查交换计数。并再次运行,直到没有交换完成或交换计数与以前相同。
【解决方案2】:

我最终重新排列到一个新数组。对于那些和我有同样问题的人,我就是这样做的:

<?php

$colors = ["red","red","red","red","red","red","blue","blue","green","green","green","green","green","green","red","red","red"];
$newColors = array();

$uniqColors = array_values(array_unique($colors));

$countUniqColors = count($uniqColors);

$y = 0;

for ($i = 0; $i <= count($colors) - 1; $i++) {
    $newColors[$i] = $uniqColors[$y];
    $y += 1;
    if ($y >= $countUniqColors) $y = 0; 
}

print_r($newColors);

?>

我认为这是我能想到的最有效的方法。如果您对此解决方案有任何想法,请告诉我

【讨论】:

    【解决方案3】:

    只是另一个想法:

    • 取出数组并从头到尾扫描
    • 将下一个与当前进行比较,如果不相等,则继续
    • 将下一个与当前进行比较,当相等时,搜索下一个不同的并与下一个不同的交换下一个

    根据您对比原始问题更糟糕的情况的评论,我建议您尝试一下,确保永远不会有一个单词会出现两次。

    $colors = ["red", "red", "red", "red", "red", "red", "blue", "blue", "green", "green", "green", "green", "green", "green", "red", "red", "red"];
    
    for ($i = 0; $i < count($colors) - 1; $i++) {
        if ($colors[$i] !== $colors[$i + 1]) continue;
    
        for ($k = $i + 2; $k < count($colors) - 1; $k++) {
            if ($colors[$i + 1] === $colors[$k]) continue;
            $tmp = $colors[$i + 1];
            $colors[$i + 1] = $colors[$k];
            $colors[$k] = $tmp;
            break;
        }
    }
    
    print_r($colors);
    
    
    Array
    (
        [0] => red
        [1] => blue
        [2] => red
        [3] => blue
        [4] => red
        [5] => green
        [6] => red
        [7] => green
        [8] => red
        [9] => green
        [10] => red
        [11] => green
        [12] => red
        [13] => green
        [14] => red
        [15] => green
        [16] => red
    )
    

    【讨论】:

      猜你喜欢
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多