【问题标题】:remove duplicates from array (array unic by key)从数组中删除重复项(数组键唯一)
【发布时间】:2011-12-13 14:51:33
【问题描述】:
Array
(
    [0] => Array
        (
            [file] => /var/websites/example.com/assets/images/200px/1419050406e6648e1c766551a0ffc91380fd6ff3406002011-10-233750.jpg
            [md5] => 42479bee7a304d2318250de2ef1962a9
            [url] => http://example.com/assets/images/200px/1419050406e6648e1c766551a0ffc91380fd6ff3406002011-10-233750.jpg
        )

    [1] => Array
        (
            [file] => /var/websites/example.com/assets/images/200px/21277792606e6648e1c766551a0ffc91380fd6ff3406002011-10-233750.jpg
            [md5] => 42479bee7a304d2318250de2ef1962a9
            [url] => http://example.com/assets/images/200px/21277792606e6648e1c766551a0ffc91380fd6ff3406002011-10-233750.jpg
        )
)

如何从上述数组中删除 md5 键重复项?

【问题讨论】:

  • 您是要仅删除 md5 键,还是删除包含重复键的整个数组?
  • 通用数组还是特定于某种语言?
  • @Tim,看标签,我认为是关于 PHP 的

标签: php arrays


【解决方案1】:

这是我在你们的帮助之后的最后一个功能......希望它对未来的人有所帮助......

    $data = array(
          array(
            'md5' => 'alpha',
            'some' => 'value',
          ),
          array(
            'md5' => 'alpha',
            'some' => 'other value',
          ),
          array(
            'md5' => 'bravo',
            'some' => 'third value',
          ),
        );
        // walk input array


        function remove_duplicateKeys($key,$data){

        $_data = array();

        foreach ($data as $v) {
          if (isset($_data[$v[$key]])) {
            // found duplicate
            continue;
          }
          // remember unique item
          $_data[$v[$key]] = $v;
        }
        // if you need a zero-based array
        // otherwise work with $_data
        $data = array_values($_data);
        return $data;
        }

$my_array = remove_duplicateKeys("md5",$data);

【讨论】:

  • 这很好,但我如何在其中添加嵌套键?现在让我们说“some”里面有“name”,我如何避免在[“some”][“name”]中重复?
【解决方案2】:

PHP 已经具备从数组中删除重复元素的功能。但不幸的是,array_unique 只支持基于字符串的比较:

注意:当且仅当(string) $elem1 === (string) $elem2 时,才认为两个元素相等。换句话说:当字符串表示相同时。将使用第一个元素。

问题是任何array turned into a string 都等于任何其他数组:

数组总是被转换成字符串“Array”; […]

但是你可以利用数组键的唯一性来解决这个问题:

$index = array();
foreach ($arr as $key => $item) {
    if (isset($index[$item['md5']])) {
        unset($item[$key]);
    }
    $index[$item['md5']] = TRUE;
}

【讨论】:

  • 我认为您的意思是 $item['md5'] 而不是 $arr['md5']
【解决方案3】:
<?php
$data = array(
  array(
    'md5' => 'alpha',
    'some' => 'value',
  ),
  array(
    'md5' => 'alpha',
    'some' => 'other value',
  ),
  array(
    'md5' => 'bravo',
    'some' => 'third value',
  ),
);
// walk input array
$_data = array();
foreach ($data as $v) {
  if (isset($_data[$v['md5']])) {
    // found duplicate
    continue;
  }
  // remember unique item
  $_data[$v['md5']] = $v;
}
// if you need a zero-based array, otheriwse work with $_data
$data = array_values($_data);

【讨论】:

  • 不客气。介意标记您的问题正在回答吗? (不管哪个答案……Gumbo 的答案也很好……)
【解决方案4】:

由于array_unique 对平面数组进行操作,因此您不能直接使用它。但是您可以先将所有'md5' 值映射到一个平面数组,对其进行唯一化,然后使用array_intersect_key 获取元素:

$allMd5s = array_map(function($v) {return $v['md5'];}, $array);

$uniqueMd5s = array_unique($md5);

$result = array_intersect_key($arr, $uniqueMd5s);

【讨论】:

    【解决方案5】:
    // your array
    $array = array(...);
    // will be used to store md5 hashes
    $md5 = array();
    // walk through array
    foreach ($array as $key => $arr) {
      // have we already seen this md5 hash?
      if (in_array($arr['md5'], $md5)){
        // remove element
        unset($array[$key]);
      }else {
        // keep element, but add it's md5
        $md5[] = $arr['md5'];
      }
    }
    

    【讨论】:

      【解决方案6】:

      使用array_filter()。快速代码测试(不一定反映你的情况,但你应该明白):

      <?php
      header('Content-Type: Text/Plain');
      $array = array(
          0 => array('name' => 'samson'),
          1 => array('name' => 'delilah'),
          2 => array('name' => 'samson'),
          3 => array('name' => 'goliath'),
      );
      
      $md5Processed = array();
      
      $newArray = array_filter($array, "uniqueMD5");
      
      print_r($newArray);
      
      exit;
      
      function uniqueMD5( $data ){
          global $md5Processed;
      
          if( !in_array( $data['name'], $md5Processed ) )
          {
              $md5Processed[] = $data['name'];
              return true;
          }
      }
      

      【讨论】:

        【解决方案7】:

        看看函数array_unique

        【讨论】:

        • 它不会删除md5s,因为对于每个数组单元格,它们都是唯一值
        • array_unique 不适用于多维数组。该函数使用每个元素的字符串表示来比较它们。
        • 不幸的是array_unique 不适用于多维数组。此外,array_unique 使用 === 运算符来比较两个项目 - 因此您必须小心数据的存储方式。
        • @FelixKling:数组的字符串表示形式是什么?
        • @Eric:是"Array"(afaik,或类似的东西)。 IE。每个元素(数组)都有相同的字符串表示,因此这个函数没有用。
        猜你喜欢
        • 2020-09-20
        • 1970-01-01
        • 1970-01-01
        • 2011-01-04
        • 2011-06-29
        相关资源
        最近更新 更多