【问题标题】:Array almost unique criteria数组几乎唯一的标准
【发布时间】:2012-02-21 04:31:17
【问题描述】:

如何正确地使这样的数组独一无二? (我所说的唯一是指只有数组 [3] 被删除,因为它是数组 [2] 的副本)

array(
 array( "Title", 50, 96 ),
 array( "Other Title", 110, 225 ),
 array( "Title", 110, 225 ),
 array( "Title", 110, 225 ),
)

在这种情况下,我希望过滤掉的唯一数组是最后一个(在这种情况下),但没有特定的顺序,手工劳动不会削减它。 (弹出目标位置)。这是一个相当大的数组,我必须在这里考虑性能。

我也可以将数据安排成这样:

array(
 array( "Title" => array( 50, 96 ), array(110, 225) )
 array( "Other Title", array( 110, 225 ) )
)

但这一次对我的事业没有帮助。

数组中没有唯一值(单独),但每个二级数组的值组合都是唯一的。

【问题讨论】:

    标签: php arrays loops unique


    【解决方案1】:

    试试这个.....

    $input = array_map("unserialize", array_unique(array_map("serialize", $input)));
    

    【讨论】:

    • 聪明。 :) 但可能相当昂贵。
    【解决方案2】:

    肯定有人会用性能更好的解决方案打败我,但这是一个简单的解决方案。您所做的就是通过连接所有元素来“散列”原始数组,然后跟踪哪些元素已添加到唯一输入集中。仅当原始数组的“散列”(连接值)尚未添加到散列数组时,您才添加原始数组。

    $aMain = array(
     array( "Title", 50, 96 ),
     array( "Other Title", 110, 225 ),
     array( "Title", 110, 225 ),
     array( "Title", 110, 225 ),
    );
    
    $_aHashed = array();
    $aUniqued = array();
    foreach($aMain as $aUnhashed) {
        $sHash = implode('', $aUnhashed);
        if(!in_array($sHash, $_aHashed)) {
            $_aHashed[] = $sHash;
            $aUniqued[] = $aUnhashed;
        }
    }
    
    var_dump($aUniqued);
    

    【讨论】:

      【解决方案3】:
      $array = array(array("Title", 50, 96), array("Other Title", 110, 225), array("Title", 110, 225), array("Title", 110, 225));
      
      function remove_duplicates_multi_array($array) {
      
          $serialized_arrays = array();
          // serialize every array
          foreach ($array as $key=>$value) {
              $serialized_arrays[$key] = serialize($value);
          }
          // use array_unique to remove duplicates
          $unique_array = array_unique($serialized_arrays);
      
          $multi_unique = array();
      
          //unserialize every item inside the array
          foreach($unique_array as $key=>$value) {
              $multi_unique[$key] = unserialize($value);
          }
      
          return $multi_unique;
      }
      
      var_dump(remove_duplicates_multi_array($array));
      

      【讨论】:

        【解决方案4】:
        $filtered = array();
        foreach ($array as $entry) {
            $hash = md5(serialize($entry));
            $filtered[$hash] = $entry;
        }
        

        您甚至应该可以不用md5 以加快处理速度。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-26
          • 1970-01-01
          • 2022-11-11
          • 2022-09-29
          • 2012-03-01
          相关资源
          最近更新 更多