【问题标题】:PHP remove duplicates in a large arrayPHP删除大数组中的重复项
【发布时间】:2020-03-20 17:22:15
【问题描述】:

我正在从数组中删除重复项,我使用了array_unique($array)

这里是我测试过的数组的示例:[7 6 4 3 3 4 9]

'the initial order of the values must be kept' 

这是我的功能:

 function rmrepeat ($array) {
    $array2 = array_unique($array); 
    return $array2; 
 } 
 // Input Array 
 $a=array(7, 6, 4, 3, 3, 4, 9); 
 $newArray = rmrepeat($a);

然后我得到了 2 个主要错误:

  • 当我在一个包含 299 个元素的数组上测试它时,它不起作用。

  • 第二个问题是它没有返回数组的最后一个元素

我尝试过的:

  • 我试图在谷歌上搜索谁来删除大型数组中的重复项,但没有找到我正在寻找的结果
  • 我已经尝试了函数 end($array) 然后 array_push 函数将最后一个元素添加到我的函数中,但它也没有工作,我猜它甚至不是正确的解决方案。 我没有收到任何明确的错误要与您分享。

可能是什么问题?

提前致谢。

【问题讨论】:

  • 使用 array_unique 删除相同的值。
  • 我用过它(我在上面提到过),还有所有的 $sort_flags。
  • 你能告诉我们你的代码吗?
  • 也分享一下预期的结果。

标签: php arrays duplicates


【解决方案1】:

您的代码运行良好。所以我 100% 确定你错误地认为最后一个值被省略了。事实上,它被删除了,因为它被重复了,并且您要求通过运行array_unique() 来删除所有重复的值。对于一个简单的测试,运行此代码并检查您是否再次看到这些问题。

function rmrepeat ($array) {
    $array2 = array_unique($array); 
    return $array2; 
} 

$a = [];
for($i=0;$i<1000;$i++){
    array_push($a, $i);
}

echo "Before removing duplicates: ", (string)count($a), PHP_EOL;

$a = rmrepeat($a);

echo "After removing duplicates: ", (string)count($a), PHP_EOL;

这里不会有任何重复的值,因此数组长度不会有任何变化。如果您将array_push($a, $i); 更改为array_push($a, rand(100, 200));,那么许多索引将被删除,并且在大多数情况下最后一项也会被删除。

【讨论】:

    【解决方案2】:
    try this
    $a=array(7,6,4,3,3,4,9); 
    $newArray = array_unique($a);
    print_r($newArray);
    

    或者这个

    $a=array(7,6,4,3,3,4,9);
    $count = count($a);
    $c = [];
    for($i=0;$i<count($a);$i++){
      if(!in_array($a[$i],$c)){
         array_push($c,$a[$i]);
      }
    }
     print_r($c);
    

    【讨论】:

      【解决方案3】:

      我不推荐的另一个可能有帮助的解决方案是覆盖默认内存容量。你可以这样做:

      ini_set('memory_limit', '-1')
      

      进一步阅读: http://php.net/memory_limit

      【讨论】:

        【解决方案4】:

        为了在使用 array_unique 时保留最后一项,您需要先反转数组以先生成最后一项。

        $arr = ["a" => 7, "B"=>6, "C"=>4, "D"=>3, "E"=>3, "F"=>4, "G"=>9];
        var_dump($arr);
        
        $arr = array_reverse($arr); // reverse to remove first occurence
        $arr = array_reverse(array_unique($arr)); // array_unique and reverse back again
        
        var_dump($arr);
        

        现在它将保留 "E" => 3 并删除 "D",并保留 "F" 但删除 "C"。
        https://3v4l.org/7P4IP


        如果 order 意味着键,那么您可以将 true 作为第二个参数添加到 array_revers 以保留键。

        $arr = [1, 2, 5, 2, 9];
        var_dump($arr);
        
        $arr = array_reverse($arr, true);
        $arr = array_reverse(array_unique($arr), true);
        
        var_dump($arr);
        

        返回

        array(4) {
          [0] => int(1)
          // Notice key 1 is missing with value 2
          [2] => int(5)
          [3] => int(2)
          [4] => int(9)
        }
        

        https://3v4l.org/DkETK

        【讨论】:

        • 这是一个解决方案,但正如我上面所说,我应该保持顺序相同,我不允许更改值的顺序,这是编码游戏测试中的一个问题
        • 似乎不适用于数字索引:- 3v4l.org/dZqND(顺便说一句,我不是反对者)
        • @AnantSingh---AlivetoDie 那是因为使用索引数组,array_reverse 不保留密钥。实际上它可以工作,它保持正确的值,但键被重置。请参阅此处的示例:3v4l.org/0b1ko 25 之后被保留,但键被重置
        • @AnantSingh---AlivetoDie 我想我的问题还不够清楚,我会做下一个测试,到时候我会得到所有的细节,我写了什么代码,我有什么确切的结果得到了,写一个很清楚的问题。谢谢
        • @OmarElRafhi 订单是什么意思?是钥匙吗?使用正确的措辞或详细解释您的意思非常重要。因为顺序和键不一样。
        猜你喜欢
        • 2011-02-21
        • 1970-01-01
        • 2020-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多