从PHP数组中删除相似元素

3

我有一个这样结构的数组:

$arrNames = array(

array('first'=>'John', 'last'=>'Smith', 'id'=>'1'),
array('first'=>'John', 'last'=>'Smith', 'id'=>'2'),
array('first'=>'John', 'last'=>'Smith', 'id'=>'3')

)

我需要删除名字和姓氏相同的相似元素。通常,我会使用array_unique函数,但是这些元素并不完全唯一,因为每个元素都有一个唯一的id。我不关心保留哪个id。我只需要数组看起来像这样:

$arrNames = array(

array('first'=>'John', 'last'=>'Smith', 'id'=>'1') // can be any id from the original array

)

有没有快速完成这个任务的方法?我的第一个想法是使用类似冒泡排序的算法,但我想知道是否有更好(更快)的方法。生成的数组将添加到下拉列表框中,重复的条目会使一些用户感到困惑。选择记录后,我使用ID从数据库中检索它。因此,它必须包含在数组中。

特定的ID重要吗,还是您只需要其中一个可能的ID之一? - Explosion Pills
array_map() 可能会对你有所帮助... - Madara's Ghost
具体的ID并不重要。 - creatvepro
1
我认为它已经在这里了: https://dev59.com/73I-5IYBdhLWcg3wbHq- - Ben
2个回答

6
<?php

  $arrNames = array(
    array('first'=>'John', 'last'=>'Smith', id=>'1'),
    array('first'=>'John', 'last'=>'Smith', id=>'2'),
    array('first'=>'John', 'last'=>'Smith', id=>'3')
  );

  $arrFound = array();
  foreach ($arrNames as $intKey => $arrPerson) {
    $arrPersonNoId = array(
      'first' => $arrPerson['first'],
      'last' => $arrPerson['last']
    );
    if (in_array($arrPersonNoId, $arrFound)) {
      unset($arrNames[$intKey]);
    } else {
      $arrFound[] = $arrPersonNoId;
    }
  }
  unset($arrFound, $intKey, $arrPerson, $arrPersonNoId);

  print_r($arrNames);

这绝对“可行”,但是否是最佳方式还有待商榷...
这里有一个Codepad链接。

1
当你发布答案时,我正在编写类似这样的内容。在将名字和姓氏连接成字符串后再插入到 $arrFound 中。这样使用 in_array() 会更有效率。 - Tim
@Tim 我最初就是这样写的,然后我意识到它容易出错 - 如果你有两个人,John SonsmithJohnson Smith呢?显然这可以通过大小写来克服,但如果它来自用户输入,则可能不可靠... - DaveRandom
更好的解决方案是使用 serialize() - Madara's Ghost
它已经在stackoverflow上了: https://dev59.com/73I-5IYBdhLWcg3wbHq- - Ben
@Truth 这是一个好主意,因为它可以很容易地实现不区分大小写。 - DaveRandom
@DaveRandom 我想到了这个:$arrPerson['first'].'%%'.$arrPerson['last']。在我看来,序列化是不必要的开销。字符串比较也可以忽略大小写。 - Tim

1

我不知道有什么快速简便的方法,但是假设“相似元素”的ID并不重要(即您只需要一个ID周期),这里有一种相对简单的方法来实现它。

$final = array();
foreach ($array as $values) {
   $final[$values['first'] . $values['last']] = $values;
}
$array = array_values($final);

最后一步不是必须的...只有在您想要删除派生密钥时才需要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接