从PHP数组中删除类似元素

从PHP数组中删除类似元素,php,Php,我有一个如下结构的数组: $arrNames = array( array('first'=>'John', 'last'=>'Smith', 'id'=>'1'), array('first'=>'John', 'last'=>'Smith', 'id'=>'2'), array('first'=>'John', 'last'=>'Smith', 'id'=>'3') ) $arrNames = array( array('firs

我有一个如下结构的数组:

$arrNames = array(

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

)
$arrNames = array(

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

)
我需要删除拳头和姓氏相同的类似元素。通常,我会使用array_unique,但元素并不完全唯一,因为每个元素都有一个唯一的id。我不在乎保留哪个id。我只需要阵列看起来像这样:

$arrNames = array(

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

)
$arrNames = array(

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

)

有没有一个快速的方法来实现这一点?我的第一个想法是使用气泡排序,但我想知道是否有更好(更快)的方法。结果数组被添加到下拉列表框中,重复的条目会让一些用户感到困惑。我正在使用ID在选中记录后将其从数据库中拉回来。因此,它必须包含在数组中。

据我所知,没有快速简便的方法,但这里有一种相对简单的方法,假设“相似元素”的ID不重要(即,您只需要一个ID周期)

<?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);

最后一步并非绝对必要。。只有当您想删除派生密钥时。

特定ID重要吗,还是您只需要几个可能的ID中的一个?
array\u map()
可能会在这里帮助您…特定ID不重要。我想它已经在这里了:当您发布答案时,正在写这样的东西。在将名字和姓氏插入
$arrFound
之前,我会将它们压缩成一个字符串
in_array()
那样会更有效。@Tim我最初是这样写的,后来我意识到它很容易出错-如果你有两个人,
John Sonsmith
Johnson Smith
?显然,使用大小写可以克服这一问题,但如果它来自用户输入,则可能不可靠……更好的解决方案是使用
serialize()
。它已经在stackoverflow中:@Truth这是一个好主意,因为它可以很容易地不区分大小写