【问题标题】:How to check if duplicate values of some indexes exist in multi dimensional array or not?如何检查多维数组中是否存在某些索引的重复值?
【发布时间】:2017-01-25 08:09:47
【问题描述】:

我的问题是我有一个从表单发布到 php 的多维数组,现在我想检查多维数组中是否存在某些索引的重复值? 例如:

$data=Array
(
    0 => Array
    (
        uid => '100',
        name => 'Sandra Shush',
        type => 'abc'
    ),
    1 => Array
    (
        uid  => '101',
        name => 'Sandra Shushtext',
        type => 'xyz'
    ),
    2 => Array
    (
        uid => '100',
        name => 'Sandra Shush',
        type => 'abc'
    )
);

这里的索引1和2的名称和类型是一样的,那么如何查看呢?

我熟悉

$key = array_search('abc', array_column($data, 'type'));

但它是用于多行中单列值的重复,在我的情况下,如果同一行的多列与任何其他行的多列相同,则记录将被视为重复。

任何帮助都应该感谢,在此先感谢。

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:

    您可以尝试使用array_reduce,通过使用所需的项目密钥创建密钥:

    $result = array_reduce($data, function ($carry, $item) {
    
        $key = $item['uid'] . $item['type'];
    
        $item['is_duplicate'] = isset($carry[$key]);
    
        if ($item['is_duplicate']) {
            $carry[] = $item;
        } else {
            $carry[$key] = $item;
        }
    
        return $carry;
    
    }, []);
    
    var_dump($result);
    

    【讨论】:

      【解决方案2】:

      最简单的方法,至少我会使用的方法是将您的数组编码为 md5(或任何其他类型)字符串并比较这些值。
      我认为在您的情况下这是最有效的。

      示例:

      <?php
      
      function arrayToString($array) {
          $str = ''; 
      
          if ( !is_array($array) ) 
              return $str; 
      
          foreach ( $array as $key => $val ) {
              $str .= $key . ':' . $val; 
          }
      
          return $str; 
      }
      
      $data=Array
      (
          0 => Array
          (
              'uid' => '100',
              'name' => 'Sandra Shush',
              'type' => 'abc'
          ),
          1 => Array
          (
              'uid'  => '100',
              'name' => 'Sandra Shush',
              'type' => 'xyz'
          ),
          2 => Array
          (
              'uid' => '100',
              'name' => 'Sandra Shush',
              'type' => 'abc'
          )
      );
      
      $temp = array(); 
      foreach ( $data as $d ) {
          array_push($temp, md5(arrayToString($d))); 
      }
      
      $unique = array_unique($temp); 
      
      var_dump($unique); // prints unique array
      

      【讨论】:

        【解决方案3】:

        这是一种非常快速的设计方法,可以找到重复项。请注意,重复项是对同一键具有相同值的元素。因此,如果 uidnametype 中的任何一个匹配,它们将被视为重复项。因此我调整了第三个数组元素,因为数组中的所有元素共享相同的值。

        $data = [
            ....
            2 =>
                [
                    'uid'  => '200',
                    'name' => 'Mandra Shush',
                    'type' => 'abcx'
                ]
        ];
        
        $duplicates      = [];
        $valuesToCompare = ["uid", "name", "type"];
        
        function equals($value, $toCompare, $keysToCompare)
        {
            foreach ($keysToCompare as $compareKey) {
                if ($value[$compareKey] === $toCompare[$compareKey]) {
                    return true;
                }
            }
        
            return false;
        }
        
        foreach ($data as $index => $element) {
            foreach ($data as $indexInner => $elementToCompare) {
                if ($index !== $indexInner) {
                    if (equals($element, $elementToCompare, $valuesToCompare)) {
                        $duplicates[] = [$index => $indexInner];
                    }
                }
            }
        }
        
        var_dump($duplicates);
        

        这将输出以下内容,这表明我们找到了 2 个重复项。其中元素 0 是 1 的副本,1 是 0 的副本。

        array (size=2)
          0 => 
            array (size=1)
              0 => int 1
          1 => 
            array (size=1)
              1 => int 0
        

        【讨论】:

          【解决方案4】:

          我实现了这样的上述场景:

          不知道哪个是我最好的或其他发布答案的人。

          foreach($data as $key => $row)
          {
              $combinedarr[] = array("name"=>$row["name"],"type"=>$row["type"]);
          }
          //chck if same facilitiy is being visit on same date twice
          $countcomb = count($combinedarr);
          $uniquearr = array_unique($combinedarr, SORT_REGULAR);
          if($countcomb==count($uniquearr)){
          }else{
              //yes duplicate exists
          };
          

          再次感谢那些回答的人。

          【讨论】:

            猜你喜欢
            • 2013-05-24
            • 2019-03-05
            • 2012-04-21
            • 1970-01-01
            • 1970-01-01
            • 2023-03-26
            • 2016-09-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多